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,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Stripe Integration
|
|
3
|
+
sidebar_label: Stripe Integration
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
:::note{title="Beta"}
|
|
7
|
+
|
|
8
|
+
API Monetization is in beta and free to try. The APIs are stable but should be
|
|
9
|
+
evaluated in non-production environments first. To go to production, contact
|
|
10
|
+
[sales@zuplo.com](mailto:sales@zuplo.com). Production pricing has not yet been
|
|
11
|
+
announced.
|
|
12
|
+
|
|
13
|
+
:::
|
|
14
|
+
|
|
15
|
+
Zuplo uses Stripe to handle payment processing, subscription billing, and
|
|
16
|
+
invoicing. Zuplo handles metering, quota enforcement, and subscription state —
|
|
17
|
+
Stripe handles money.
|
|
18
|
+
|
|
19
|
+
## How it works
|
|
20
|
+
|
|
21
|
+
The integration flow:
|
|
22
|
+
|
|
23
|
+
1. You define plans, features, and meters in Zuplo
|
|
24
|
+
2. You connect your Stripe account via the Zuplo Portal
|
|
25
|
+
3. When you publish plans, corresponding Stripe Products and Prices are created
|
|
26
|
+
automatically
|
|
27
|
+
4. Customers subscribe through your Developer Portal via Stripe Checkout
|
|
28
|
+
5. Stripe processes the payment and creates the subscription
|
|
29
|
+
6. A Zuplo subscription is created with an API key scoped to the plan's
|
|
30
|
+
entitlements
|
|
31
|
+
7. As the customer uses the API, the monetization policy meters usage in real
|
|
32
|
+
time
|
|
33
|
+
8. For usage-based billing, usage is tracked continuously and billed through
|
|
34
|
+
Stripe automatically
|
|
35
|
+
|
|
36
|
+
Throughout this flow, Zuplo is the source of truth for access control and
|
|
37
|
+
metering. Stripe is the source of truth for payment state.
|
|
38
|
+
|
|
39
|
+
## Connecting your Stripe account
|
|
40
|
+
|
|
41
|
+
### Via the Zuplo Portal
|
|
42
|
+
|
|
43
|
+
1. Navigate to **Services → Monetization Service → Payment Provider**
|
|
44
|
+
2. Click **Configure** on the Stripe card
|
|
45
|
+
3. Enter a **Name** and paste your **Stripe API Key**
|
|
46
|
+
4. Click **Save**
|
|
47
|
+
|
|
48
|
+
The connection authorizes Zuplo to manage Stripe objects on your behalf,
|
|
49
|
+
including products, prices, customers, and subscriptions.
|
|
50
|
+
|
|
51
|
+
### Test mode vs. live mode
|
|
52
|
+
|
|
53
|
+
Connect with a Stripe **test** key (`sk_test_...`) first to validate your
|
|
54
|
+
configuration end-to-end. Test mode uses Stripe's test card numbers (e.g.,
|
|
55
|
+
`4242 4242 4242 4242`) and never charges real money.
|
|
56
|
+
|
|
57
|
+
When you're ready to go live, update to your live key (`sk_live_...`).
|
|
58
|
+
|
|
59
|
+
:::caution
|
|
60
|
+
|
|
61
|
+
Always use your Stripe **test** key while developing. Test mode and live mode
|
|
62
|
+
are separate environments in Stripe. Products, customers, and subscriptions
|
|
63
|
+
don't transfer between them.
|
|
64
|
+
|
|
65
|
+
:::
|
|
66
|
+
|
|
67
|
+
## What Zuplo creates in Stripe
|
|
68
|
+
|
|
69
|
+
When you publish a plan, corresponding objects are created in Stripe
|
|
70
|
+
automatically:
|
|
71
|
+
|
|
72
|
+
| Zuplo concept | Stripe object created |
|
|
73
|
+
| -------------------- | -------------------------------- |
|
|
74
|
+
| Plan | Product |
|
|
75
|
+
| Rate card (flat fee) | Price (recurring, fixed amount) |
|
|
76
|
+
| Rate card (per-unit) | Price (recurring, metered usage) |
|
|
77
|
+
| Rate card (tiered) | Price (recurring, tiered) |
|
|
78
|
+
| Feature entitlement | Metadata on the Product |
|
|
79
|
+
|
|
80
|
+
You can see these in your Stripe Dashboard under **Products**. These objects are
|
|
81
|
+
managed automatically — don't edit them directly in Stripe, as your changes may
|
|
82
|
+
be overwritten on the next plan publish.
|
|
83
|
+
|
|
84
|
+
## Subscription flow
|
|
85
|
+
|
|
86
|
+
### New subscription
|
|
87
|
+
|
|
88
|
+
When a customer clicks "Subscribe" in your Developer Portal:
|
|
89
|
+
|
|
90
|
+
1. A Stripe Checkout Session is created with the selected plan's prices
|
|
91
|
+
2. The customer is redirected to Stripe Checkout to enter payment details
|
|
92
|
+
3. On successful payment, the subscription is created
|
|
93
|
+
4. An API key is generated scoped to the subscription's plan entitlements
|
|
94
|
+
5. The customer is redirected back to the Developer Portal, where they can
|
|
95
|
+
immediately see their subscription, usage dashboard, and API key
|
|
96
|
+
|
|
97
|
+
### Plan changes (upgrades/downgrades)
|
|
98
|
+
|
|
99
|
+
When a customer changes their plan through the Developer Portal:
|
|
100
|
+
|
|
101
|
+
1. The Stripe Subscription is updated with the new plan's prices
|
|
102
|
+
2. Charges are prorated automatically
|
|
103
|
+
3. The customer's entitlements update immediately
|
|
104
|
+
4. The API key remains the same; its associated quota changes in real time
|
|
105
|
+
|
|
106
|
+
Upgrades take effect immediately. Downgrades take effect at the next billing
|
|
107
|
+
cycle.
|
|
108
|
+
|
|
109
|
+
### Cancellation
|
|
110
|
+
|
|
111
|
+
When a customer cancels:
|
|
112
|
+
|
|
113
|
+
1. The subscription is set to cancel at the end of the current billing period
|
|
114
|
+
(by default)
|
|
115
|
+
2. The customer retains access until their current billing period ends
|
|
116
|
+
3. At period end, access is revoked and the API key stops working
|
|
117
|
+
|
|
118
|
+
## Proration
|
|
119
|
+
|
|
120
|
+
When customers upgrade or downgrade mid-billing-period, charges are prorated
|
|
121
|
+
automatically. Upgrades are charged the prorated difference for the remainder of
|
|
122
|
+
the billing period. Downgrades result in a prorated credit applied to the next
|
|
123
|
+
invoice.
|
|
124
|
+
|
|
125
|
+
## Usage-based billing
|
|
126
|
+
|
|
127
|
+
For plans with usage-based pricing (per-unit, tiered, pay-as-you-go), usage is
|
|
128
|
+
tracked in real time by the `MonetizationInboundPolicy`. Each API request
|
|
129
|
+
increments the meter immediately. At the end of the billing period, usage is
|
|
130
|
+
billed through Stripe automatically.
|
|
131
|
+
|
|
132
|
+
You don't need to implement usage reporting or run any batch jobs.
|
|
133
|
+
|
|
134
|
+
## Handling failed payments
|
|
135
|
+
|
|
136
|
+
When Stripe fails to collect payment, access is determined by the subscription's
|
|
137
|
+
payment status. By default, a 3-day grace period allows continued access while
|
|
138
|
+
Stripe retries the payment.
|
|
139
|
+
|
|
140
|
+
| Payment status | Default behavior |
|
|
141
|
+
| --------------- | ------------------------------------------------ |
|
|
142
|
+
| `paid` | Full access |
|
|
143
|
+
| `not_required` | Full access (free plans) |
|
|
144
|
+
| `pending` | Full access (within grace period) |
|
|
145
|
+
| `failed` | Access blocked after grace period (configurable) |
|
|
146
|
+
| `uncollectible` | Access blocked |
|
|
147
|
+
|
|
148
|
+
The grace period is configurable via `zuplo_max_payment_overdue_days` metadata
|
|
149
|
+
on the plan or customer (default: 3 days).
|
|
150
|
+
|
|
151
|
+
## Customer portal
|
|
152
|
+
|
|
153
|
+
Stripe provides a hosted Customer Portal where customers can update their
|
|
154
|
+
payment method, view invoices, and manage their subscription. The Developer
|
|
155
|
+
Portal links to this from the subscription management page.
|
|
156
|
+
|
|
157
|
+
To enable the Stripe Customer Portal:
|
|
158
|
+
|
|
159
|
+
1. Configure the Customer Portal in your
|
|
160
|
+
[Stripe Dashboard → Settings → Billing → Customer Portal](https://dashboard.stripe.com/settings/billing/portal)
|
|
161
|
+
2. Enable the features you want (update payment method, view invoices, cancel
|
|
162
|
+
subscription)
|
|
163
|
+
3. The Developer Portal automatically includes a "Manage Billing" link that
|
|
164
|
+
opens the Stripe Customer Portal
|
|
165
|
+
|
|
166
|
+
## Testing
|
|
167
|
+
|
|
168
|
+
### Test card numbers
|
|
169
|
+
|
|
170
|
+
Use Stripe's test card numbers to simulate different scenarios:
|
|
171
|
+
|
|
172
|
+
| Card number | Scenario |
|
|
173
|
+
| --------------------- | ---------------------------------------- |
|
|
174
|
+
| `4242 4242 4242 4242` | Successful payment |
|
|
175
|
+
| `4000 0000 0000 3220` | Requires 3D Secure authentication |
|
|
176
|
+
| `4000 0000 0000 0341` | Attaches to customer but fails on charge |
|
|
177
|
+
| `4000 0000 0000 9995` | Declined (insufficient funds) |
|
|
178
|
+
|
|
179
|
+
### Verifying the integration
|
|
180
|
+
|
|
181
|
+
After connecting Stripe and publishing plans:
|
|
182
|
+
|
|
183
|
+
1. Open your Developer Portal
|
|
184
|
+
2. Subscribe to a plan using test card `4242 4242 4242 4242`
|
|
185
|
+
3. Verify in Stripe Dashboard:
|
|
186
|
+
- Customer created
|
|
187
|
+
- Subscription active
|
|
188
|
+
- Product and Price match your plan
|
|
189
|
+
4. Make API requests and verify:
|
|
190
|
+
- Requests succeed within quota
|
|
191
|
+
- `403 Forbidden` returned when quota exceeded (hard limit plans)
|
|
192
|
+
- Usage visible in the Developer Portal dashboard
|
|
193
|
+
5. Cancel the subscription and verify:
|
|
194
|
+
- Access revoked after billing period
|
|
195
|
+
- Stripe subscription shows canceled
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Subscription Lifecycle
|
|
3
|
+
sidebar_label: Subscription Lifecycle
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
:::note{title="Beta"}
|
|
7
|
+
|
|
8
|
+
API Monetization is in beta and free to try. The APIs are stable but should be
|
|
9
|
+
evaluated in non-production environments first. To go to production, contact
|
|
10
|
+
[sales@zuplo.com](mailto:sales@zuplo.com). Production pricing has not yet been
|
|
11
|
+
announced.
|
|
12
|
+
|
|
13
|
+
:::
|
|
14
|
+
|
|
15
|
+
This guide covers the full lifecycle of a customer subscription: creation,
|
|
16
|
+
trials, upgrades, downgrades, cancellation, and reactivation.
|
|
17
|
+
|
|
18
|
+
## Subscription states
|
|
19
|
+
|
|
20
|
+
| Status | API access | Description |
|
|
21
|
+
| ----------- | ---------- | ------------------------------------------------- |
|
|
22
|
+
| `active` | Yes | Subscription is active and payment is current |
|
|
23
|
+
| `inactive` | No | Subscription is not yet active or was deactivated |
|
|
24
|
+
| `canceled` | No | Subscription has been canceled |
|
|
25
|
+
| `scheduled` | No | Subscription is scheduled for future activation |
|
|
26
|
+
|
|
27
|
+
:::note
|
|
28
|
+
|
|
29
|
+
Access is also governed by payment status. If a payment is overdue beyond the
|
|
30
|
+
grace period (default 3 days, configurable via `zuplo_max_payment_overdue_days`
|
|
31
|
+
metadata), access is blocked even for active subscriptions.
|
|
32
|
+
|
|
33
|
+
:::
|
|
34
|
+
|
|
35
|
+
## Creating subscriptions
|
|
36
|
+
|
|
37
|
+
### Self-serve (Developer Portal)
|
|
38
|
+
|
|
39
|
+
The standard path. Customer signs up in the Developer Portal, picks a plan,
|
|
40
|
+
completes Stripe Checkout, and gets their API key immediately.
|
|
41
|
+
|
|
42
|
+
1. Customer visits the pricing page
|
|
43
|
+
2. Clicks "Subscribe" on their chosen plan
|
|
44
|
+
3. Completes Stripe Checkout (enters payment details)
|
|
45
|
+
4. Redirected back to the Developer Portal
|
|
46
|
+
5. Subscription is active, API key is generated
|
|
47
|
+
|
|
48
|
+
### Programmatic (API)
|
|
49
|
+
|
|
50
|
+
Create subscriptions directly via the API for cases where the checkout happens
|
|
51
|
+
outside the Developer Portal (custom frontend, sales-assisted onboarding,
|
|
52
|
+
internal tooling):
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
curl -X POST https://dev.zuplo.com/v3/metering/{bucketId}/subscriptions \
|
|
56
|
+
-H "Authorization: Bearer {API_KEY}" \
|
|
57
|
+
-H "Content-Type: application/json" \
|
|
58
|
+
-d '{
|
|
59
|
+
"customerId": "cus_abc123",
|
|
60
|
+
"planKey": "pro",
|
|
61
|
+
"stripeCustomerId": "cus_stripe_xyz"
|
|
62
|
+
}'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The `customerId` is the user's identifier in your auth system (Auth0 user ID,
|
|
66
|
+
etc.). The `stripeCustomerId` is the customer's ID in Stripe.
|
|
67
|
+
|
|
68
|
+
## Free trials
|
|
69
|
+
|
|
70
|
+
Trials are modeled as the first phase of a multi-phase plan. No special trial
|
|
71
|
+
API is needed.
|
|
72
|
+
|
|
73
|
+
### How trials work
|
|
74
|
+
|
|
75
|
+
1. Customer subscribes to a plan that has a trial phase
|
|
76
|
+
2. The subscription is activated with the trial phase's entitlements (e.g.,
|
|
77
|
+
1,000 requests)
|
|
78
|
+
3. When the trial phase duration expires:
|
|
79
|
+
- The subscription transitions to the next phase (the paid phase)
|
|
80
|
+
- Stripe charges the customer for the first paid period
|
|
81
|
+
- Entitlements update to the paid phase's rate cards
|
|
82
|
+
4. If payment fails at trial end, access depends on the payment grace period
|
|
83
|
+
configuration
|
|
84
|
+
|
|
85
|
+
### Trial configuration example
|
|
86
|
+
|
|
87
|
+
**14-day trial with automatic conversion to paid:**
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"key": "pro-trial",
|
|
92
|
+
"name": "Pro with Free Trial",
|
|
93
|
+
"currency": "USD",
|
|
94
|
+
"billingCadence": "P1M",
|
|
95
|
+
"phases": [
|
|
96
|
+
{
|
|
97
|
+
"key": "trial",
|
|
98
|
+
"name": "14-Day Free Trial",
|
|
99
|
+
"duration": "P2W",
|
|
100
|
+
"rateCards": [
|
|
101
|
+
{
|
|
102
|
+
"type": "flat_fee",
|
|
103
|
+
"key": "api_calls",
|
|
104
|
+
"name": "API Calls",
|
|
105
|
+
"featureKey": "api_calls",
|
|
106
|
+
"billingCadence": null,
|
|
107
|
+
"price": null,
|
|
108
|
+
"entitlementTemplate": {
|
|
109
|
+
"type": "metered",
|
|
110
|
+
"issueAfterReset": 1000,
|
|
111
|
+
"isSoftLimit": false
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"key": "default",
|
|
118
|
+
"name": "Pro Monthly",
|
|
119
|
+
"duration": null,
|
|
120
|
+
"rateCards": [
|
|
121
|
+
{
|
|
122
|
+
"type": "usage_based",
|
|
123
|
+
"key": "api_calls",
|
|
124
|
+
"name": "API Calls",
|
|
125
|
+
"featureKey": "api_calls",
|
|
126
|
+
"billingCadence": "P1M",
|
|
127
|
+
"price": {
|
|
128
|
+
"type": "tiered",
|
|
129
|
+
"mode": "graduated",
|
|
130
|
+
"tiers": [
|
|
131
|
+
{
|
|
132
|
+
"upToAmount": "50000",
|
|
133
|
+
"flatPrice": { "type": "flat", "amount": "99.00" },
|
|
134
|
+
"unitPrice": null
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"flatPrice": null,
|
|
138
|
+
"unitPrice": { "type": "unit", "amount": "0.50" }
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"entitlementTemplate": {
|
|
143
|
+
"type": "metered",
|
|
144
|
+
"issueAfterReset": 50000,
|
|
145
|
+
"isSoftLimit": true
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
This plan gives customers a 14-day trial with 1,000 requests (hard limit, no
|
|
155
|
+
billing). When the trial ends, they automatically transition to the paid Pro
|
|
156
|
+
phase at $99/month with 50,000 requests and overage billing. No cron jobs, no
|
|
157
|
+
webhook handlers, no transition code.
|
|
158
|
+
|
|
159
|
+
### What happens when a trial expires
|
|
160
|
+
|
|
161
|
+
If the plan has a paid phase after the trial:
|
|
162
|
+
|
|
163
|
+
- Stripe charges the customer automatically
|
|
164
|
+
- On success: subscription transitions to the paid phase with paid entitlements
|
|
165
|
+
- On failure: access depends on the payment grace period configuration
|
|
166
|
+
|
|
167
|
+
If the customer cancels during the trial:
|
|
168
|
+
|
|
169
|
+
- They retain trial access until the trial period ends
|
|
170
|
+
- No payment is charged
|
|
171
|
+
- After the trial period, access is revoked
|
|
172
|
+
|
|
173
|
+
## Plan changes (upgrades and downgrades)
|
|
174
|
+
|
|
175
|
+
### Customer-initiated (Developer Portal)
|
|
176
|
+
|
|
177
|
+
Customers can change plans from the Subscriptions page in the Developer Portal:
|
|
178
|
+
|
|
179
|
+
1. Customer clicks "Change Plan" on their active subscription
|
|
180
|
+
2. Sees available plans with pricing comparison
|
|
181
|
+
3. Selects the new plan
|
|
182
|
+
4. Stripe handles proration (charge or credit the difference)
|
|
183
|
+
5. Entitlements update immediately — the customer's quota changes in real time
|
|
184
|
+
6. The API key stays the same
|
|
185
|
+
|
|
186
|
+
### Programmatic (API)
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
curl -X PATCH https://dev.zuplo.com/v3/metering/{bucketId}/subscriptions/{subscriptionId} \
|
|
190
|
+
-H "Authorization: Bearer {API_KEY}" \
|
|
191
|
+
-H "Content-Type: application/json" \
|
|
192
|
+
-d '{
|
|
193
|
+
"planKey": "enterprise"
|
|
194
|
+
}'
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Proration behavior
|
|
198
|
+
|
|
199
|
+
When a customer changes plans mid-billing-period, Zuplo uses
|
|
200
|
+
**max-consumption-based proration** to calculate a fair credit from the old
|
|
201
|
+
plan. Instead of only considering how much time has passed, the system looks at
|
|
202
|
+
both elapsed time and actual quota usage, then uses whichever is greater.
|
|
203
|
+
|
|
204
|
+
This prevents situations where a customer consumes most of their quota early in
|
|
205
|
+
the billing period, switches plans, and receives a large time-based credit that
|
|
206
|
+
does not reflect their actual usage.
|
|
207
|
+
|
|
208
|
+
**Upgrade (e.g., Starter → Pro):**
|
|
209
|
+
|
|
210
|
+
- New entitlements take effect immediately
|
|
211
|
+
- A proration credit from the old plan appears as a line-item discount on the
|
|
212
|
+
new plan's invoice
|
|
213
|
+
|
|
214
|
+
**Downgrade (e.g., Pro → Starter):**
|
|
215
|
+
|
|
216
|
+
- New (lower) entitlements take effect at the next billing cycle
|
|
217
|
+
- A proration credit from the old plan is applied as a discount on the next
|
|
218
|
+
invoice
|
|
219
|
+
|
|
220
|
+
**Example:** A customer on Starter ($29/month, 10,000 requests) upgrades to Pro
|
|
221
|
+
on day 15 of a 30-day period, having used 7,000 requests.
|
|
222
|
+
|
|
223
|
+
| Factor | Value |
|
|
224
|
+
| ------------------ | -------------- |
|
|
225
|
+
| Time elapsed | 50% (15 / 30) |
|
|
226
|
+
| Quota consumed | 70% (7K / 10K) |
|
|
227
|
+
| Max of the two | 70% |
|
|
228
|
+
| **Credit applied** | **$8.70** |
|
|
229
|
+
|
|
230
|
+
The credit is applied once and is not carried forward to future billing cycles.
|
|
231
|
+
|
|
232
|
+
### Quota reset on plan change
|
|
233
|
+
|
|
234
|
+
When a customer changes plans, the quota usage counter does **not** reset. If a
|
|
235
|
+
customer used 8,000 of their 10,000-request Starter quota and upgrades to Pro
|
|
236
|
+
(50,000 requests), they have 42,000 remaining for the current period — not
|
|
237
|
+
50,000.
|
|
238
|
+
|
|
239
|
+
This prevents gaming where a customer uses up their starter quota, upgrades
|
|
240
|
+
momentarily, and immediately downgrades.
|
|
241
|
+
|
|
242
|
+
## Cancellation
|
|
243
|
+
|
|
244
|
+
### Customer-initiated
|
|
245
|
+
|
|
246
|
+
Customers can cancel from the Developer Portal subscriptions page:
|
|
247
|
+
|
|
248
|
+
1. Customer clicks "Cancel Subscription"
|
|
249
|
+
2. Confirmation dialog explains what happens
|
|
250
|
+
3. Cancellation is scheduled for the end of the current billing period
|
|
251
|
+
4. Customer retains full access until the period ends
|
|
252
|
+
5. At period end, access is revoked and the API key stops working
|
|
253
|
+
|
|
254
|
+
### Programmatic cancellation
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
curl -X POST https://dev.zuplo.com/v3/metering/{bucketId}/subscriptions/{subscriptionId}/cancel \
|
|
258
|
+
-H "Authorization: Bearer {API_KEY}"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Cancellation behavior
|
|
262
|
+
|
|
263
|
+
| Scenario | Default behavior |
|
|
264
|
+
| ---------------------------- | ------------------------------------------ |
|
|
265
|
+
| Active subscription canceled | Access until period end, then revoked |
|
|
266
|
+
| Trial subscription canceled | Access until trial end, no payment charged |
|
|
267
|
+
| Subscription with overage | Overage billed on final invoice |
|
|
268
|
+
|
|
269
|
+
## Reactivation
|
|
270
|
+
|
|
271
|
+
A canceled subscription (scheduled for end-of-period) can be reactivated before
|
|
272
|
+
the period ends:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
curl -X POST https://dev.zuplo.com/v3/metering/{bucketId}/subscriptions/{subscriptionId}/unschedule-cancelation \
|
|
276
|
+
-H "Authorization: Bearer {API_KEY}"
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
This removes the pending cancellation. The subscription continues as normal.
|
|
280
|
+
|
|
281
|
+
A fully canceled subscription (past the period end) can be restored:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
curl -X POST https://dev.zuplo.com/v3/metering/{bucketId}/subscriptions/{subscriptionId}/restore \
|
|
285
|
+
-H "Authorization: Bearer {API_KEY}"
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Multiple subscriptions
|
|
289
|
+
|
|
290
|
+
A customer can hold multiple active subscriptions simultaneously. This supports
|
|
291
|
+
scenarios like:
|
|
292
|
+
|
|
293
|
+
- A primary monthly subscription plus a credit pack top-up
|
|
294
|
+
- Separate subscriptions for different API products
|
|
295
|
+
- A team subscription and a personal subscription
|
|
296
|
+
|
|
297
|
+
Each subscription generates its own API key. The customer uses the appropriate
|
|
298
|
+
key for each use case.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tax Collection — Enabling Stripe Tax
|
|
3
|
+
sidebar_label: Tax Collection
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
:::note{title="Beta"}
|
|
7
|
+
|
|
8
|
+
API Monetization is in beta and free to try. The APIs are stable but should be
|
|
9
|
+
evaluated in non-production environments first. To go to production, contact
|
|
10
|
+
[sales@zuplo.com](mailto:sales@zuplo.com). Production pricing has not yet been
|
|
11
|
+
announced.
|
|
12
|
+
|
|
13
|
+
:::
|
|
14
|
+
|
|
15
|
+
Zuplo supports automatic tax collection through Stripe Tax. When enabled, taxes
|
|
16
|
+
(such as VAT, sales tax, or GST) are automatically calculated and added to your
|
|
17
|
+
customers' invoices.
|
|
18
|
+
|
|
19
|
+
## Prerequisites
|
|
20
|
+
|
|
21
|
+
- Monetization configured with Stripe connected (see
|
|
22
|
+
[Quickstart](./quickstart.md))
|
|
23
|
+
- A billing profile (created automatically during initial setup)
|
|
24
|
+
- Tax registrations added in Stripe for countries where you collect tax
|
|
25
|
+
|
|
26
|
+
## Add tax registrations in Stripe
|
|
27
|
+
|
|
28
|
+
You must add tax registrations in Stripe for every country where you are
|
|
29
|
+
required to collect tax. Without a registration, Stripe Tax cannot calculate
|
|
30
|
+
taxes for customers in that country.
|
|
31
|
+
|
|
32
|
+
1. Go to your
|
|
33
|
+
[Stripe Tax registrations page](https://dashboard.stripe.com/tax/registrations).
|
|
34
|
+
2. Click **+ Add registration** and add each country where you have a tax
|
|
35
|
+
obligation.
|
|
36
|
+
|
|
37
|
+
## Find your billing profile
|
|
38
|
+
|
|
39
|
+
Retrieve your billing profiles to get the billing profile ID:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
curl -X GET "https://dev.zuplo.com/v3/metering/${ZUPLO_BUCKET_ID}/billing/profiles" \
|
|
43
|
+
-H "Authorization: Bearer ${ZUPLO_API_KEY}" \
|
|
44
|
+
-H "Content-Type: application/json"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The response contains an `items` array. Save the `id` from your billing profile
|
|
48
|
+
as `BILLING_PROFILE_ID`.
|
|
49
|
+
|
|
50
|
+
## Enable tax collection
|
|
51
|
+
|
|
52
|
+
Use the PUT endpoint to update the billing profile. You need to change two
|
|
53
|
+
things:
|
|
54
|
+
|
|
55
|
+
1. **Set the correct supplier country** in `supplier.addresses[0].country`. Tax
|
|
56
|
+
calculation depends on your supplier country — it defines what taxes your
|
|
57
|
+
company is required to collect. Use the
|
|
58
|
+
[ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
|
59
|
+
country code (e.g., `US`, `GB`, `DE`).
|
|
60
|
+
|
|
61
|
+
2. **Enable tax collection** by setting `workflow.tax.enabled` to `true`.
|
|
62
|
+
|
|
63
|
+
First, get the current billing profile to use as a base for the update:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
curl -X GET "https://dev.zuplo.com/v3/metering/${ZUPLO_BUCKET_ID}/billing/profiles/${BILLING_PROFILE_ID}" \
|
|
67
|
+
-H "Authorization: Bearer ${ZUPLO_API_KEY}" \
|
|
68
|
+
-H "Content-Type: application/json"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then update the profile with tax enabled. The key fields to change in the
|
|
72
|
+
response body are:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"supplier": {
|
|
77
|
+
"addresses": [
|
|
78
|
+
{
|
|
79
|
+
"country": "GB"
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"name": "Stripe Account"
|
|
83
|
+
},
|
|
84
|
+
"workflow": {
|
|
85
|
+
"tax": {
|
|
86
|
+
"enabled": true,
|
|
87
|
+
"enforced": false
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Send the full profile body back via PUT:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
curl -X PUT "https://dev.zuplo.com/v3/metering/${ZUPLO_BUCKET_ID}/billing/profiles/${BILLING_PROFILE_ID}" \
|
|
97
|
+
-H "Authorization: Bearer ${ZUPLO_API_KEY}" \
|
|
98
|
+
-H "Content-Type: application/json" \
|
|
99
|
+
-d '{ ... full billing profile body with tax enabled ... }'
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Tax enforcement modes
|
|
103
|
+
|
|
104
|
+
The `workflow.tax` object controls how tax collection behaves:
|
|
105
|
+
|
|
106
|
+
| `enabled` | `enforced` | Behavior |
|
|
107
|
+
| --------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
108
|
+
| `false` | `false` | **No tax calculation.** Stripe Tax is not used. Invoices are created without tax lines. |
|
|
109
|
+
| `true` | `false` | **Best-effort tax calculation.** Tax is calculated when possible. If it fails (e.g., no valid customer tax location or no tax registration for their country), the invoice is finalized without tax. |
|
|
110
|
+
| `true` | `true` | **Strict tax enforcement.** Tax calculation is required. If Stripe Tax returns an error, the invoice fails and the customer cannot complete the purchase. |
|
|
111
|
+
|
|
112
|
+
:::tip
|
|
113
|
+
|
|
114
|
+
Start with `enforced: false` (best-effort) to avoid blocking customers in
|
|
115
|
+
countries where you haven't added a tax registration. You can switch to strict
|
|
116
|
+
enforcement after you have registrations in place for all your target markets.
|
|
117
|
+
|
|
118
|
+
:::
|
|
119
|
+
|
|
120
|
+
## Tax behavior configuration
|
|
121
|
+
|
|
122
|
+
You can configure whether tax is **included in the price** or **added on top of
|
|
123
|
+
it** by adding a `defaultTaxConfig` to the `invoicing` section of your billing
|
|
124
|
+
profile:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"invoicing": {
|
|
129
|
+
"autoAdvance": true,
|
|
130
|
+
"draftPeriod": "P0D",
|
|
131
|
+
"dueAfter": "P0D",
|
|
132
|
+
"progressiveBilling": true,
|
|
133
|
+
"defaultTaxConfig": {
|
|
134
|
+
"behavior": "exclusive",
|
|
135
|
+
"stripe": {
|
|
136
|
+
"code": "txcd_10000000"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
| Setting | Description |
|
|
144
|
+
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
145
|
+
| `behavior: "exclusive"` | Tax is added on top of the listed price. A $9.99 plan with 20% VAT charges $11.99. |
|
|
146
|
+
| `behavior: "inclusive"` | Tax is included in the listed price. A $9.99 plan total stays $9.99, with tax extracted from that amount. |
|
|
147
|
+
| `stripe.code` | The Stripe Tax code for your product category. `txcd_10000000` is the general "Software as a Service (SaaS)" category. |
|
|
148
|
+
|
|
149
|
+
## Troubleshooting
|
|
150
|
+
|
|
151
|
+
### Customers blocked from subscribing
|
|
152
|
+
|
|
153
|
+
When `enforced` is `true` and a customer tries to subscribe from a country where
|
|
154
|
+
you have not added a Stripe tax registration, they see an error and cannot
|
|
155
|
+
create or upgrade subscriptions.
|
|
156
|
+
|
|
157
|
+
**Fix:** Add a tax registration for the missing country in Stripe, or set
|
|
158
|
+
`enforced` to `false` to use best-effort mode.
|
|
159
|
+
|
|
160
|
+
### Invoices missing tax lines
|
|
161
|
+
|
|
162
|
+
If tax collection is enabled but invoices don't show tax:
|
|
163
|
+
|
|
164
|
+
- Verify you have a tax registration for the customer's country.
|
|
165
|
+
- Check that the customer's address includes a valid country.
|
|
166
|
+
- Confirm `workflow.tax.enabled` is `true` on the billing profile.
|