zuplo 6.67.32 → 6.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Rate Limiting
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Rate limiting controls how many requests a client can make to your API within a
|
|
6
|
+
given time window. It protects your backend from traffic spikes, enforces fair
|
|
7
|
+
usage across consumers, and enables tiered access for different customer plans.
|
|
8
|
+
|
|
9
|
+
Zuplo's rate limiter uses a **sliding window algorithm** enforced globally
|
|
10
|
+
across all edge locations. When a client exceeds the limit, they receive a
|
|
11
|
+
`429 Too Many Requests` response with a `retry-after` header indicating when
|
|
12
|
+
they can retry.
|
|
13
|
+
|
|
14
|
+
## Rate limiting policies
|
|
15
|
+
|
|
16
|
+
Zuplo provides two rate limiting policies, each suited to different levels of
|
|
17
|
+
complexity.
|
|
18
|
+
|
|
19
|
+
### Rate Limiting policy
|
|
20
|
+
|
|
21
|
+
The [Rate Limiting policy](../policies/rate-limit-inbound.mdx) enforces a single
|
|
22
|
+
request counter per time window. Configure a maximum number of requests, a time
|
|
23
|
+
window, and how to identify callers.
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"name": "my-rate-limit-policy",
|
|
28
|
+
"policyType": "rate-limit-inbound",
|
|
29
|
+
"handler": {
|
|
30
|
+
"export": "RateLimitInboundPolicy",
|
|
31
|
+
"module": "$import(@zuplo/runtime)",
|
|
32
|
+
"options": {
|
|
33
|
+
"rateLimitBy": "user",
|
|
34
|
+
"requestsAllowed": 100,
|
|
35
|
+
"timeWindowMinutes": 1
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Use this policy when you need a straightforward "X requests per Y minutes"
|
|
42
|
+
limit.
|
|
43
|
+
|
|
44
|
+
### Complex Rate Limiting policy
|
|
45
|
+
|
|
46
|
+
The [Complex Rate Limiting policy](../policies/complex-rate-limit-inbound.mdx)
|
|
47
|
+
supports **multiple named counters** in a single policy. Each counter tracks a
|
|
48
|
+
different resource or unit of work.
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"name": "my-complex-rate-limit-policy",
|
|
53
|
+
"policyType": "complex-rate-limit-inbound",
|
|
54
|
+
"handler": {
|
|
55
|
+
"export": "ComplexRateLimitInboundPolicy",
|
|
56
|
+
"module": "$import(@zuplo/runtime)",
|
|
57
|
+
"options": {
|
|
58
|
+
"rateLimitBy": "user",
|
|
59
|
+
"timeWindowMinutes": 1,
|
|
60
|
+
"limits": {
|
|
61
|
+
"requests": 100,
|
|
62
|
+
"compute": 500
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
You can override counter increments programmatically per request using
|
|
70
|
+
`ComplexRateLimitInboundPolicy.setIncrements()`. This is useful for usage-based
|
|
71
|
+
pricing where different endpoints consume different amounts of a resource (for
|
|
72
|
+
example, counting compute units or tokens instead of raw requests).
|
|
73
|
+
|
|
74
|
+
## Choosing a policy
|
|
75
|
+
|
|
76
|
+
| Scenario | Policy |
|
|
77
|
+
| ------------------------------------------------------ | --------------------------------------------- |
|
|
78
|
+
| Fixed requests-per-minute limit for all callers | Rate Limiting |
|
|
79
|
+
| Different limits per customer tier (free vs. paid) | Rate Limiting with a custom function |
|
|
80
|
+
| Counting multiple resources (requests + compute units) | Complex Rate Limiting |
|
|
81
|
+
| Usage-based billing with variable cost per request | Complex Rate Limiting with dynamic increments |
|
|
82
|
+
|
|
83
|
+
## How `rateLimitBy` works
|
|
84
|
+
|
|
85
|
+
The `rateLimitBy` option determines how the rate limiter groups requests into
|
|
86
|
+
buckets. Both policies support the same four modes.
|
|
87
|
+
|
|
88
|
+
### `ip`
|
|
89
|
+
|
|
90
|
+
Groups requests by the client's IP address. No authentication is required. This
|
|
91
|
+
is the simplest option and works well for public APIs or as a first layer of
|
|
92
|
+
protection.
|
|
93
|
+
|
|
94
|
+
### `user`
|
|
95
|
+
|
|
96
|
+
Groups requests by the authenticated user's identity (`request.user.sub`). When
|
|
97
|
+
using [API key authentication](../articles/api-key-authentication.mdx), the
|
|
98
|
+
`sub` value is the consumer name you assigned when creating the API key. When
|
|
99
|
+
using JWT authentication, it comes from the token's `sub` claim.
|
|
100
|
+
|
|
101
|
+
This is the recommended mode for authenticated APIs because it ties limits to
|
|
102
|
+
the actual consumer rather than a shared IP address.
|
|
103
|
+
|
|
104
|
+
### `function`
|
|
105
|
+
|
|
106
|
+
Groups requests using a custom TypeScript function that you provide. The
|
|
107
|
+
function returns a `CustomRateLimitDetails` object containing a grouping key
|
|
108
|
+
and, optionally, overridden values for `requestsAllowed` and
|
|
109
|
+
`timeWindowMinutes`.
|
|
110
|
+
|
|
111
|
+
This mode enables dynamic rate limiting where limits vary based on customer
|
|
112
|
+
tier, route parameters, or any other request property.
|
|
113
|
+
|
|
114
|
+
### `all`
|
|
115
|
+
|
|
116
|
+
Applies a single shared counter across all requests to the route, regardless of
|
|
117
|
+
who makes them. Use this for global rate limits on endpoints that call
|
|
118
|
+
resource-constrained backends.
|
|
119
|
+
|
|
120
|
+
## Dynamic rate limiting with custom functions
|
|
121
|
+
|
|
122
|
+
When `rateLimitBy` is set to `"function"`, you provide a TypeScript module that
|
|
123
|
+
determines the rate limit at request time. The function signature is:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
import {
|
|
127
|
+
CustomRateLimitDetails,
|
|
128
|
+
ZuploContext,
|
|
129
|
+
ZuploRequest,
|
|
130
|
+
} from "@zuplo/runtime";
|
|
131
|
+
|
|
132
|
+
export function rateLimit(
|
|
133
|
+
request: ZuploRequest,
|
|
134
|
+
context: ZuploContext,
|
|
135
|
+
policyName: string,
|
|
136
|
+
): CustomRateLimitDetails | undefined {
|
|
137
|
+
const user = request.user;
|
|
138
|
+
|
|
139
|
+
if (user.data.customerType === "premium") {
|
|
140
|
+
return {
|
|
141
|
+
key: user.sub,
|
|
142
|
+
requestsAllowed: 1000,
|
|
143
|
+
timeWindowMinutes: 1,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
key: user.sub,
|
|
149
|
+
requestsAllowed: 50,
|
|
150
|
+
timeWindowMinutes: 1,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The `CustomRateLimitDetails` object has the following properties:
|
|
156
|
+
|
|
157
|
+
- `key` - The string used to group requests into rate limit buckets
|
|
158
|
+
- `requestsAllowed` (optional) - Overrides the policy's `requestsAllowed` value
|
|
159
|
+
- `timeWindowMinutes` (optional) - Overrides the policy's `timeWindowMinutes`
|
|
160
|
+
value
|
|
161
|
+
|
|
162
|
+
Returning `undefined` skips rate limiting for that request entirely.
|
|
163
|
+
|
|
164
|
+
The function can also be `async` if you need to look up limits from a database
|
|
165
|
+
or external service. See
|
|
166
|
+
[Per-user rate limiting using a database](../articles/per-user-rate-limits-using-db.mdx)
|
|
167
|
+
for a complete example using the ZoneCache for performance.
|
|
168
|
+
|
|
169
|
+
Wire the function into the policy configuration using the `identifier` option:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"export": "RateLimitInboundPolicy",
|
|
174
|
+
"module": "$import(@zuplo/runtime)",
|
|
175
|
+
"options": {
|
|
176
|
+
"rateLimitBy": "function",
|
|
177
|
+
"requestsAllowed": 50,
|
|
178
|
+
"timeWindowMinutes": 1,
|
|
179
|
+
"identifier": {
|
|
180
|
+
"export": "rateLimit",
|
|
181
|
+
"module": "$import(./modules/rate-limit)"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
:::note
|
|
188
|
+
|
|
189
|
+
The `requestsAllowed` and `timeWindowMinutes` values in the policy configuration
|
|
190
|
+
serve as defaults. The custom function can override them per request.
|
|
191
|
+
|
|
192
|
+
:::
|
|
193
|
+
|
|
194
|
+
## Combining rate limiting with authentication
|
|
195
|
+
|
|
196
|
+
Rate limiting works best when combined with authentication so that limits apply
|
|
197
|
+
per consumer rather than per IP. A typical policy pipeline is:
|
|
198
|
+
|
|
199
|
+
1. **Authentication** (e.g., API Key Authentication) -- validates credentials
|
|
200
|
+
and populates `request.user`
|
|
201
|
+
2. **Rate Limiting** with `rateLimitBy: "user"` -- enforces per-consumer limits
|
|
202
|
+
using `request.user.sub`
|
|
203
|
+
|
|
204
|
+
With API key authentication, the consumer's metadata (stored when creating the
|
|
205
|
+
key) is available at `request.user.data`. A custom rate limit function can read
|
|
206
|
+
fields like `customerType` or `plan` from the metadata to apply tiered limits.
|
|
207
|
+
|
|
208
|
+
## Rate limiting and monetization
|
|
209
|
+
|
|
210
|
+
If you use Zuplo's
|
|
211
|
+
[Monetization](../articles/monetization/monetization-policy.md) feature, the
|
|
212
|
+
monetization policy handles quota enforcement based on subscription plans. You
|
|
213
|
+
can still add a rate limiting policy after the monetization policy to provide
|
|
214
|
+
per-second or per-minute spike protection on top of monthly billing quotas.
|
|
215
|
+
These serve different purposes:
|
|
216
|
+
|
|
217
|
+
- **Monetization quotas** enforce monthly or billing-period usage limits tied to
|
|
218
|
+
a subscription plan
|
|
219
|
+
- **Rate limiting** protects against short-duration traffic spikes that could
|
|
220
|
+
overwhelm your backend
|
|
221
|
+
|
|
222
|
+
## Combining multiple rate limit policies
|
|
223
|
+
|
|
224
|
+
You can apply multiple rate limiting policies to the same route. For example,
|
|
225
|
+
you might enforce both a per-minute and a per-hour limit. When using multiple
|
|
226
|
+
policies, apply the longest time window first, followed by shorter durations.
|
|
227
|
+
|
|
228
|
+
## Additional options
|
|
229
|
+
|
|
230
|
+
Both rate limiting policies support the following additional options:
|
|
231
|
+
|
|
232
|
+
- `headerMode` - Set to `"retry-after"` (default) to include the `retry-after`
|
|
233
|
+
header in 429 responses, or `"none"` to omit it
|
|
234
|
+
- `mode` - Set to `"strict"` (default) for synchronous enforcement, or `"async"`
|
|
235
|
+
for non-blocking checks that may allow some requests over the limit
|
|
236
|
+
- `throwOnFailure` - Set to `true` to return an error if the rate limit service
|
|
237
|
+
is unreachable, or `false` (default) to allow the request through
|
|
238
|
+
|
|
239
|
+
## Related resources
|
|
240
|
+
|
|
241
|
+
- [Rate Limiting policy reference](../policies/rate-limit-inbound.mdx)
|
|
242
|
+
- [Complex Rate Limiting policy reference](../policies/complex-rate-limit-inbound.mdx)
|
|
243
|
+
- [Dynamic Rate Limiting tutorial](../articles/step-5-dynamic-rate-limiting.mdx)
|
|
244
|
+
- [Per-user rate limiting with a database](../articles/per-user-rate-limits-using-db.mdx)
|
|
245
|
+
- [Quota policy](../policies/quota-inbound.mdx)
|
|
246
|
+
- [Monetization policy](../articles/monetization/monetization-policy.md)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Request Lifecycle
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Every request that reaches Zuplo passes through a well-defined pipeline of
|
|
6
|
+
stages. Click any stage below to learn what it does, when to use it, and find
|
|
7
|
+
relevant documentation.
|
|
8
|
+
|
|
9
|
+
<RequestLifecycle />
|
|
10
|
+
|
|
11
|
+
## Short-circuiting
|
|
12
|
+
|
|
13
|
+
At several stages, the pipeline can be short-circuited by returning a `Response`
|
|
14
|
+
instead of passing the request through:
|
|
15
|
+
|
|
16
|
+
- **[Pre-routing hooks](../programmable-api/runtime-extensions.mdx)** can return
|
|
17
|
+
a `Response` to skip routing entirely
|
|
18
|
+
- **[Request hooks](../programmable-api/hooks.mdx)** can return a `Response` to
|
|
19
|
+
skip policies and the handler
|
|
20
|
+
- **[Inbound policies](../articles/policies.mdx)** can return a `Response`
|
|
21
|
+
(e.g., 401 Unauthorized) to skip the handler and outbound policies
|
|
22
|
+
|
|
23
|
+
This is how [authentication policies](./authentication.mdx) work: they check
|
|
24
|
+
credentials and return an error response if the request is not authorized,
|
|
25
|
+
preventing it from reaching your backend.
|
|
26
|
+
|
|
27
|
+
## Choosing the right extension point
|
|
28
|
+
|
|
29
|
+
**Use a [policy](../articles/policies.mdx)** when you need reusable logic that
|
|
30
|
+
applies to multiple routes. Policies are configured per-route in your
|
|
31
|
+
[OpenAPI spec](../articles/openapi.mdx) and can be shared across any number of
|
|
32
|
+
routes. Examples: [authentication](./authentication.mdx),
|
|
33
|
+
[rate limiting](../policies/rate-limit-inbound.mdx),
|
|
34
|
+
[request validation](../policies/request-validation-inbound.mdx),
|
|
35
|
+
[header manipulation](../policies/set-headers-inbound.mdx).
|
|
36
|
+
|
|
37
|
+
**Use a [handler](../handlers/custom-handler.mdx)** when you need to define the
|
|
38
|
+
core behavior of a route -
|
|
39
|
+
[forwarding to a backend](../handlers/url-forward.mdx), generating a response,
|
|
40
|
+
or implementing business logic. Each route has exactly one handler.
|
|
41
|
+
|
|
42
|
+
**Use a [hook](../programmable-api/hooks.mdx)** when you need logic that runs on
|
|
43
|
+
every request globally, regardless of route. Examples: adding correlation IDs,
|
|
44
|
+
security headers, [logging](../articles/logging.mdx), analytics.
|
|
45
|
+
|
|
46
|
+
| I want to... | Use |
|
|
47
|
+
| ----------------------------- | -------------------------------------------------------------- |
|
|
48
|
+
| Authenticate requests | [Inbound policy](./authentication.mdx) |
|
|
49
|
+
| Rate limit requests | [Inbound policy](../policies/rate-limit-inbound.mdx) |
|
|
50
|
+
| Validate request bodies | [Inbound policy](../policies/request-validation-inbound.mdx) |
|
|
51
|
+
| Forward to a backend | [URL Forward Handler](../handlers/url-forward.mdx) |
|
|
52
|
+
| Return custom responses | [Function Handler](../handlers/custom-handler.mdx) |
|
|
53
|
+
| Transform response bodies | [Outbound policy](../policies/transform-body-outbound.mdx) |
|
|
54
|
+
| Add headers to all responses | [Response hook](../programmable-api/hooks.mdx) |
|
|
55
|
+
| Log every request | [Response final hook](../programmable-api/hooks.mdx) |
|
|
56
|
+
| Normalize URLs before routing | [Pre-routing hook](../programmable-api/runtime-extensions.mdx) |
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Source Control and Deployment
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Zuplo uses a GitOps model where your API configuration lives in source control
|
|
6
|
+
and deployments happen automatically when you push code. This page explains how
|
|
7
|
+
the working copy, source control, branches, environments, and deployment options
|
|
8
|
+
fit together.
|
|
9
|
+
|
|
10
|
+
## Working copy
|
|
11
|
+
|
|
12
|
+
Every developer gets a personal **working copy** environment when they use the
|
|
13
|
+
Zuplo Portal. The working copy is a cloud-hosted development environment that
|
|
14
|
+
deploys instantly when you save a file. You can think of it as your personal
|
|
15
|
+
cloud sandbox.
|
|
16
|
+
|
|
17
|
+
Working copy environments use a `.dev` URL (for example,
|
|
18
|
+
`my-project-abc123.zuplo.dev`) and are optimized for rapid iteration rather than
|
|
19
|
+
production traffic.
|
|
20
|
+
|
|
21
|
+
:::note
|
|
22
|
+
|
|
23
|
+
Working copy environments are available on the managed edge deployment model.
|
|
24
|
+
For managed dedicated deployments, use
|
|
25
|
+
[local development](../articles/local-development.mdx) instead.
|
|
26
|
+
|
|
27
|
+
:::
|
|
28
|
+
|
|
29
|
+
### Before connecting source control
|
|
30
|
+
|
|
31
|
+
When you first create a project, your working copy is standalone. You can edit
|
|
32
|
+
files in the portal, and Zuplo saves them. There is no Git repository involved
|
|
33
|
+
yet. This is fine for prototyping and exploring Zuplo, but for team
|
|
34
|
+
collaboration and production deployments you need source control.
|
|
35
|
+
|
|
36
|
+
### After connecting source control
|
|
37
|
+
|
|
38
|
+
When you connect a Git repository, the portal gains push/pull capabilities. You
|
|
39
|
+
can commit your working copy changes to Git and pull changes from teammates.
|
|
40
|
+
Your working copy becomes a personal branch-like workspace layered on top of the
|
|
41
|
+
repository.
|
|
42
|
+
|
|
43
|
+
## Connecting source control
|
|
44
|
+
|
|
45
|
+
Zuplo supports four Git providers: GitHub, GitLab, Bitbucket, and Azure DevOps.
|
|
46
|
+
The integration has two parts, and which parts you get depends on your provider.
|
|
47
|
+
|
|
48
|
+
| Capability | GitHub | GitLab | Bitbucket | Azure DevOps |
|
|
49
|
+
| --------------------- | ------ | ---------------- | ---------------- | ---------------- |
|
|
50
|
+
| Portal push/pull | Yes | Yes (Enterprise) | Yes (Enterprise) | Yes (Enterprise) |
|
|
51
|
+
| Automatic deployments | Yes | No -- use CLI | No -- use CLI | No -- use CLI |
|
|
52
|
+
|
|
53
|
+
**GitHub** provides the most complete experience with both portal integration
|
|
54
|
+
and automatic deployments on every push.
|
|
55
|
+
|
|
56
|
+
**GitLab, Bitbucket, and Azure DevOps** provide portal integration for pushing
|
|
57
|
+
and pulling code but do **not** include automatic deployments. You must set up
|
|
58
|
+
CI/CD pipelines that call the Zuplo CLI to deploy. See
|
|
59
|
+
[Custom CI/CD](../articles/custom-ci-cd.mdx) for details.
|
|
60
|
+
|
|
61
|
+
## Branch to environment mapping
|
|
62
|
+
|
|
63
|
+
Every Git branch maps to a Zuplo environment. The repository's default branch
|
|
64
|
+
(typically `main`) maps to the **Production** environment. Every other branch
|
|
65
|
+
maps to a **Preview** environment.
|
|
66
|
+
|
|
67
|
+
<Diagram height="h-80">
|
|
68
|
+
<DiagramGroup id="git" label="Git Repository">
|
|
69
|
+
<DiagramNode id="main" variant="green">
|
|
70
|
+
main (default branch)
|
|
71
|
+
</DiagramNode>
|
|
72
|
+
<DiagramNode id="staging">staging</DiagramNode>
|
|
73
|
+
<DiagramNode id="feature">feature/auth</DiagramNode>
|
|
74
|
+
</DiagramGroup>
|
|
75
|
+
<DiagramGroup id="zuplo" label="Zuplo Environments">
|
|
76
|
+
<DiagramNode id="prod" variant="green">
|
|
77
|
+
Production
|
|
78
|
+
</DiagramNode>
|
|
79
|
+
<DiagramNode id="preview-staging" variant="blue">
|
|
80
|
+
Preview (staging)
|
|
81
|
+
</DiagramNode>
|
|
82
|
+
<DiagramNode id="preview-feature" variant="blue">
|
|
83
|
+
Preview (feature/auth)
|
|
84
|
+
</DiagramNode>
|
|
85
|
+
</DiagramGroup>
|
|
86
|
+
<DiagramEdge from="main" to="prod" />
|
|
87
|
+
<DiagramEdge from="staging" to="preview-staging" />
|
|
88
|
+
<DiagramEdge from="feature" to="preview-feature" />
|
|
89
|
+
</Diagram>
|
|
90
|
+
|
|
91
|
+
The environment name matches the branch name. For example, pushing to a branch
|
|
92
|
+
called `staging` creates an environment named `staging` with a URL like
|
|
93
|
+
`https://my-project-staging-abc1234.zuplo.app`.
|
|
94
|
+
|
|
95
|
+
:::tip
|
|
96
|
+
|
|
97
|
+
There is **no technical difference** between Production and Preview
|
|
98
|
+
environments. Both run on the same infrastructure with identical performance
|
|
99
|
+
characteristics. The distinction controls which set of
|
|
100
|
+
[environment variables](../articles/environment-variables.mdx) and
|
|
101
|
+
[API key buckets](../articles/api-key-buckets.mdx) apply by default. Some teams
|
|
102
|
+
use Preview environments to serve production traffic for different regions or
|
|
103
|
+
tenants.
|
|
104
|
+
|
|
105
|
+
:::
|
|
106
|
+
|
|
107
|
+
For full details on branch-based deployments, see
|
|
108
|
+
[Branch-Based Deployments](../articles/branch-based-deployments.mdx).
|
|
109
|
+
|
|
110
|
+
## Deployment options
|
|
111
|
+
|
|
112
|
+
Zuplo offers two ways to deploy your API: the built-in GitHub integration and
|
|
113
|
+
the Zuplo CLI.
|
|
114
|
+
|
|
115
|
+
### GitHub integration (automatic)
|
|
116
|
+
|
|
117
|
+
With GitHub connected, every push to any branch triggers an automatic
|
|
118
|
+
deployment. Push to `main` and your Production environment updates within
|
|
119
|
+
seconds. Push to a feature branch and a Preview environment is created or
|
|
120
|
+
updated automatically.
|
|
121
|
+
|
|
122
|
+
This is the recommended setup for most teams. No CI/CD configuration is
|
|
123
|
+
required.
|
|
124
|
+
|
|
125
|
+
**[Set up GitHub integration](../articles/source-control-setup-github.mdx)**
|
|
126
|
+
|
|
127
|
+
### CLI deployment (for all other providers)
|
|
128
|
+
|
|
129
|
+
For GitLab, Bitbucket, Azure DevOps, or any other Git provider, use the Zuplo
|
|
130
|
+
CLI in your CI/CD pipeline to deploy.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
npx zuplo deploy --api-key $ZUPLO_API_KEY
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
:::warning
|
|
137
|
+
|
|
138
|
+
GitLab, Bitbucket, and Azure DevOps do **not** have built-in automatic
|
|
139
|
+
deployments. You **must** configure CI/CD pipelines that run `zuplo deploy` to
|
|
140
|
+
deploy your API. Without this, pushing code to your repository does not trigger
|
|
141
|
+
a deployment.
|
|
142
|
+
|
|
143
|
+
:::
|
|
144
|
+
|
|
145
|
+
See the provider-specific CI/CD guides:
|
|
146
|
+
|
|
147
|
+
- [GitLab CI/CD](../articles/custom-ci-cd-gitlab.mdx)
|
|
148
|
+
- [Bitbucket Pipelines](../articles/custom-ci-cd-bitbucket.mdx)
|
|
149
|
+
- [Azure DevOps Pipelines](../articles/custom-ci-cd-azure.mdx)
|
|
150
|
+
- [CircleCI](../articles/custom-ci-cd-circleci.mdx)
|
|
151
|
+
|
|
152
|
+
## CLI deploy and environment naming
|
|
153
|
+
|
|
154
|
+
When you run `zuplo deploy`, the CLI determines the environment name using the
|
|
155
|
+
following logic:
|
|
156
|
+
|
|
157
|
+
1. If you pass `--environment my-env`, the CLI uses `my-env` as the environment
|
|
158
|
+
name.
|
|
159
|
+
2. If you do not pass `--environment`, the CLI uses the **current Git branch
|
|
160
|
+
name** as the environment name.
|
|
161
|
+
|
|
162
|
+
This means in a typical CI/CD pipeline, the deploy command automatically names
|
|
163
|
+
the environment after the branch being built without any extra configuration.
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# On the "staging" branch, this creates/updates the "staging" environment
|
|
167
|
+
npx zuplo deploy --api-key $ZUPLO_API_KEY
|
|
168
|
+
|
|
169
|
+
# Override the environment name explicitly
|
|
170
|
+
npx zuplo deploy --api-key $ZUPLO_API_KEY --environment production
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
For full CLI deploy reference, see [CLI: deploy](../cli/deploy.mdx).
|
|
174
|
+
|
|
175
|
+
## Environment URLs
|
|
176
|
+
|
|
177
|
+
Each environment gets a unique URL based on the project name, environment name,
|
|
178
|
+
and a unique identifier:
|
|
179
|
+
|
|
180
|
+
| Environment | Example URL |
|
|
181
|
+
| ------------ | ---------------------------------------------- |
|
|
182
|
+
| Production | `https://my-project-main-abc1234.zuplo.app` |
|
|
183
|
+
| Preview | `https://my-project-staging-def5678.zuplo.app` |
|
|
184
|
+
| Working Copy | `https://my-project-abc123.zuplo.dev` |
|
|
185
|
+
|
|
186
|
+
Production and Preview environments use the `.zuplo.app` domain. Working copy
|
|
187
|
+
environments use the `.zuplo.dev` domain. You can configure
|
|
188
|
+
[custom domains](../articles/custom-domains.mdx) for any non-working-copy
|
|
189
|
+
environment.
|
|
190
|
+
|
|
191
|
+
## Putting it all together
|
|
192
|
+
|
|
193
|
+
The typical workflow from development to production looks like this:
|
|
194
|
+
|
|
195
|
+
<Diagram direction="vertical" height="h-96">
|
|
196
|
+
<DiagramNode id="develop" variant="blue">
|
|
197
|
+
Develop (local or working copy)
|
|
198
|
+
</DiagramNode>
|
|
199
|
+
<DiagramNode id="push">Push to feature branch</DiagramNode>
|
|
200
|
+
<DiagramNode id="preview" variant="orange">
|
|
201
|
+
Preview environment deployed
|
|
202
|
+
</DiagramNode>
|
|
203
|
+
<DiagramNode id="merge">Merge to main</DiagramNode>
|
|
204
|
+
<DiagramNode id="production" variant="green">
|
|
205
|
+
Production environment updated
|
|
206
|
+
</DiagramNode>
|
|
207
|
+
<DiagramEdge from="develop" to="push" />
|
|
208
|
+
<DiagramEdge from="push" to="preview" />
|
|
209
|
+
<DiagramEdge from="preview" to="merge" />
|
|
210
|
+
<DiagramEdge from="merge" to="production" />
|
|
211
|
+
</Diagram>
|
|
212
|
+
|
|
213
|
+
1. **Develop** locally with `zuplo dev` or in the portal working copy.
|
|
214
|
+
2. **Push** your changes to a feature branch. If using GitHub, a Preview
|
|
215
|
+
environment deploys automatically. If using another provider, your CI/CD
|
|
216
|
+
pipeline runs `zuplo deploy`.
|
|
217
|
+
3. **Test** against the Preview environment URL.
|
|
218
|
+
4. **Merge** to the default branch. The Production environment updates
|
|
219
|
+
automatically (GitHub) or via your CI/CD pipeline (other providers).
|
|
220
|
+
|
|
221
|
+
## Next steps
|
|
222
|
+
|
|
223
|
+
- [Environments](../articles/environments.mdx) -- Environment types and
|
|
224
|
+
configuration
|
|
225
|
+
- [Source Control & Deployments](../articles/source-control.mdx) -- Provider
|
|
226
|
+
setup guides
|
|
227
|
+
- [Custom CI/CD](../articles/custom-ci-cd.mdx) -- Build your own deployment
|
|
228
|
+
pipeline
|
|
229
|
+
- [CLI: deploy](../cli/deploy.mdx) -- Full CLI deploy reference
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Conference Prize Terms
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
1. By entering the prize draw you are agreeing to these prize draw terms and
|
|
6
|
+
conditions.
|
|
7
|
+
2. The prize draw is being run by Zuplo, Inc.
|
|
8
|
+
|
|
9
|
+
## Eligibility to enter
|
|
10
|
+
|
|
11
|
+
3. The prize draw is open to entrants over 18 years of age and who are
|
|
12
|
+
registered and attending the conference in-person on the standard
|
|
13
|
+
presentation days (for example, excluding and days of workshops, etc.).
|
|
14
|
+
Ticketed attendees and speakers are eligible to enter. Exhibitors, sponsors,
|
|
15
|
+
and conference staff are **not** eligible.
|
|
16
|
+
4. In entering the prize draw, you confirm that you are eligible to do so and
|
|
17
|
+
eligible to claim any prize you may win.
|
|
18
|
+
5. A maximum of one entry per individual per day is permitted. Limit of one
|
|
19
|
+
prize per family during the conference.
|
|
20
|
+
6. The prize draw is free to enter.
|
|
21
|
+
|
|
22
|
+
## How to enter
|
|
23
|
+
|
|
24
|
+
7. The prize draw will include those attendees who complete the project that's
|
|
25
|
+
shared at the booth and return to the Zuplo booth to show the completed
|
|
26
|
+
quickstart to the booth staff. Entries must be received 15 minutes before the
|
|
27
|
+
scheduled drawing. Entries after that time and date won't be included in the
|
|
28
|
+
draw.
|
|
29
|
+
8. Zuplo won't accept responsibility if contact details provided are incomplete
|
|
30
|
+
or inaccurate.
|
|
31
|
+
|
|
32
|
+
## The prize
|
|
33
|
+
|
|
34
|
+
10. The prize will be a Lego kit (one of those on display at the booth).
|
|
35
|
+
11. Zuplo's use of particular brands as prizes doesn't imply any affiliation
|
|
36
|
+
with or endorsement of such brands.
|
|
37
|
+
12. The winner will be drawn at random.
|
|
38
|
+
13. The prize is non-exchangeable, non-transferable and no cash alternatives
|
|
39
|
+
will be offered.
|
|
40
|
+
14. We reserve the right to substitute prizes with another prize of equal or
|
|
41
|
+
higher value if circumstances beyond our control make it necessary to do so.
|
|
42
|
+
15. The decision of Zuplo regarding any aspect of the prize draw is final and
|
|
43
|
+
binding and no correspondence will be entered into about it.
|
|
44
|
+
|
|
45
|
+
## Winner announcement
|
|
46
|
+
|
|
47
|
+
16. The winner for each day will be announced at the end of the day (6:00 PM on
|
|
48
|
+
Wednesday, 4:05 PM on Thursday)
|
|
49
|
+
17. The winner must be present at the time of the announcement to receive the
|
|
50
|
+
prize or another winner will be selected.
|
|
51
|
+
|
|
52
|
+
## Data protection and publicity
|
|
53
|
+
|
|
54
|
+
18. You consent to any personal information you provide in entering the prize
|
|
55
|
+
draw being used by Zuplo for the purposes of administering the prize draw,
|
|
56
|
+
and for those purposes as defined within our privacy notice.
|
|
57
|
+
19. All entrants may apply for details of the winning participant by contacting
|
|
58
|
+
us at whatzup@zuplo.com
|
|
59
|
+
20. The winner agrees to the release of their first name and place of work to
|
|
60
|
+
any other prize draw participants if requested via Zuplo.
|
|
61
|
+
21. An announcement of the winner's first name and place of work will be made
|
|
62
|
+
via Zuplo's website and social media.
|
|
63
|
+
22. All personal information shall be used in accordance with Zuplo's Privacy
|
|
64
|
+
Policy.
|
|
65
|
+
|
|
66
|
+
## Limitation of Liability
|
|
67
|
+
|
|
68
|
+
23. Zuplo doesn't accept any liability for any damage, loss, injury or
|
|
69
|
+
disappointment suffered by any entrants as a result of either participating
|
|
70
|
+
in the prize draw or being selected for a prize, save that Zuplo doesn't
|
|
71
|
+
exclude its liability for death or personal injury as a result of its own
|
|
72
|
+
negligence.
|
|
73
|
+
24. Zuplo doesn't provide any form of practical or IT support for this prize. On
|
|
74
|
+
receipt, all responsibilities relating to warranty and the product are that
|
|
75
|
+
of the prize winner.
|
|
76
|
+
|
|
77
|
+
## General
|
|
78
|
+
|
|
79
|
+
25. Zuplo reserves the right to cancel the prize draw or amend these terms and
|
|
80
|
+
conditions at any time, without prior notice.
|