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,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Monetization Policy Reference
|
|
3
|
+
sidebar_label: Monetization Policy
|
|
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
|
+
The `MonetizationInboundPolicy` is the gateway enforcement mechanism. It runs on
|
|
16
|
+
every request to a protected route, authenticates the API key, checks the
|
|
17
|
+
customer's subscription and payment status, enforces quota, meters the request,
|
|
18
|
+
and allows or blocks access.
|
|
19
|
+
|
|
20
|
+
## Basic configuration
|
|
21
|
+
|
|
22
|
+
Add the policy to your `policies.json`:
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"name": "monetization-inbound",
|
|
27
|
+
"policyType": "monetization-inbound",
|
|
28
|
+
"handler": {
|
|
29
|
+
"export": "MonetizationInboundPolicy",
|
|
30
|
+
"module": "$import(@zuplo/runtime)",
|
|
31
|
+
"options": {
|
|
32
|
+
"meters": {
|
|
33
|
+
"api_requests": 1
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then reference it in your route's inbound policy pipeline:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"x-zuplo-route": {
|
|
45
|
+
"policies": {
|
|
46
|
+
"inbound": ["monetization-inbound"]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
:::note
|
|
53
|
+
|
|
54
|
+
The `MonetizationInboundPolicy` handles API key authentication internally. It
|
|
55
|
+
reads the API key from the `Authorization` header, validates it, and sets
|
|
56
|
+
`request.user`. You do not need a separate `api-key-auth` policy on monetized
|
|
57
|
+
routes — the monetization policy replaces it.
|
|
58
|
+
|
|
59
|
+
:::
|
|
60
|
+
|
|
61
|
+
## Configuration options
|
|
62
|
+
|
|
63
|
+
| Option | Type | Default | Description |
|
|
64
|
+
| -------------------- | ------------------ | ----------------- | ------------------------------------------------- |
|
|
65
|
+
| `meters` | object | (required) | Map of meter keys to increment values |
|
|
66
|
+
| `meterOnStatusCodes` | string or number[] | `"200-299"` | Status code range to meter |
|
|
67
|
+
| `authHeader` | string | `"authorization"` | Header to read the API key from |
|
|
68
|
+
| `authScheme` | string | `"Bearer"` | Expected auth scheme prefix |
|
|
69
|
+
| `cacheTtlSeconds` | number | `60` | How long to cache subscription data (minimum 60s) |
|
|
70
|
+
|
|
71
|
+
### `meters`
|
|
72
|
+
|
|
73
|
+
The `meters` option defines which meters to increment and by how much when a
|
|
74
|
+
request is processed. Values must be positive numbers.
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
// Increment the api_requests meter by 1 per request
|
|
78
|
+
{ "meters": { "api_requests": 1 } }
|
|
79
|
+
|
|
80
|
+
// Increment multiple meters simultaneously
|
|
81
|
+
{ "meters": { "api_requests": 1, "api_credits": 5 } }
|
|
82
|
+
|
|
83
|
+
// Increment by a fixed amount per request (expensive endpoint)
|
|
84
|
+
{ "meters": { "api_credits": 10 } }
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### `meterOnStatusCodes`
|
|
88
|
+
|
|
89
|
+
Controls which responses count toward metering. By default, only successful
|
|
90
|
+
responses (2xx) are metered.
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
// Only meter successful responses (default)
|
|
94
|
+
{ "meterOnStatusCodes": "200-299" }
|
|
95
|
+
|
|
96
|
+
// Only meter 200 OK
|
|
97
|
+
{ "meterOnStatusCodes": "200" }
|
|
98
|
+
|
|
99
|
+
// Meter success and redirects
|
|
100
|
+
{ "meterOnStatusCodes": "200-399" }
|
|
101
|
+
|
|
102
|
+
// Comma-separated ranges
|
|
103
|
+
{ "meterOnStatusCodes": "200, 201, 300-304" }
|
|
104
|
+
|
|
105
|
+
// Array of specific status codes
|
|
106
|
+
{ "meterOnStatusCodes": [200, 201, 202] }
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
:::caution
|
|
110
|
+
|
|
111
|
+
The wildcard `"*"` is not a valid value for `meterOnStatusCodes` and throws a
|
|
112
|
+
configuration error. Use a specific range like `"200-599"` if you want to meter
|
|
113
|
+
most responses.
|
|
114
|
+
|
|
115
|
+
:::
|
|
116
|
+
|
|
117
|
+
This is important for fairness: if your backend returns a 500 error, you
|
|
118
|
+
probably don't want to charge the customer for that request.
|
|
119
|
+
|
|
120
|
+
### `authHeader`
|
|
121
|
+
|
|
122
|
+
The header to read the API key from. Defaults to `"authorization"`.
|
|
123
|
+
|
|
124
|
+
### `authScheme`
|
|
125
|
+
|
|
126
|
+
The expected auth scheme prefix. Defaults to `"Bearer"`. The policy expects the
|
|
127
|
+
header value in the format `{authScheme} {apiKey}`.
|
|
128
|
+
|
|
129
|
+
### `cacheTtlSeconds`
|
|
130
|
+
|
|
131
|
+
How long to cache subscription and entitlement data, in seconds. Defaults to
|
|
132
|
+
`60` with a minimum of `60`. Increasing this value reduces calls to the gateway
|
|
133
|
+
service but means entitlement changes take longer to propagate.
|
|
134
|
+
|
|
135
|
+
## Subscription and payment validation
|
|
136
|
+
|
|
137
|
+
The policy checks payment status on every request. Access is granted when:
|
|
138
|
+
|
|
139
|
+
- The subscription is active and not expired
|
|
140
|
+
- Payment status is `paid` or `not_required` (free plans)
|
|
141
|
+
|
|
142
|
+
When payment fails, a configurable grace period (default 3 days) allows
|
|
143
|
+
continued access while retries are attempted. After the grace period, access is
|
|
144
|
+
blocked until payment succeeds.
|
|
145
|
+
|
|
146
|
+
The grace period is configurable via metadata on the plan or customer:
|
|
147
|
+
|
|
148
|
+
- Plan metadata key: `zuplo_max_payment_overdue_days`
|
|
149
|
+
- Customer metadata key: `zuplo_max_payment_overdue_days`
|
|
150
|
+
- Default: `3` (days)
|
|
151
|
+
|
|
152
|
+
## Multiple policies for different routes
|
|
153
|
+
|
|
154
|
+
Different routes can have different metering configurations. Define multiple
|
|
155
|
+
policy instances:
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
[
|
|
159
|
+
{
|
|
160
|
+
"name": "monetization-standard",
|
|
161
|
+
"policyType": "monetization-inbound",
|
|
162
|
+
"handler": {
|
|
163
|
+
"export": "MonetizationInboundPolicy",
|
|
164
|
+
"module": "$import(@zuplo/runtime)",
|
|
165
|
+
"options": {
|
|
166
|
+
"meters": { "api_requests": 1 }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"name": "monetization-ai",
|
|
172
|
+
"policyType": "monetization-inbound",
|
|
173
|
+
"handler": {
|
|
174
|
+
"export": "MonetizationInboundPolicy",
|
|
175
|
+
"module": "$import(@zuplo/runtime)",
|
|
176
|
+
"options": {
|
|
177
|
+
"meters": { "api_requests": 1, "tokens": 1 }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "monetization-premium",
|
|
183
|
+
"policyType": "monetization-inbound",
|
|
184
|
+
"handler": {
|
|
185
|
+
"export": "MonetizationInboundPolicy",
|
|
186
|
+
"module": "$import(@zuplo/runtime)",
|
|
187
|
+
"options": {
|
|
188
|
+
"meters": { "api_credits": 10 }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Apply each to the appropriate routes:
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
// Simple lookup -> 1 request meter
|
|
199
|
+
"/api/v1/search": { "inbound": ["monetization-standard"] }
|
|
200
|
+
|
|
201
|
+
// AI endpoint -> 1 request + token metering
|
|
202
|
+
"/api/v1/analyze": { "inbound": ["monetization-ai"] }
|
|
203
|
+
|
|
204
|
+
// Premium endpoint -> 10 credits
|
|
205
|
+
"/api/v1/bulk-export": { "inbound": ["monetization-premium"] }
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Dynamic metering
|
|
209
|
+
|
|
210
|
+
For AI APIs and other variable-cost endpoints, you may need to meter based on
|
|
211
|
+
the response — for example, counting the number of tokens returned by an LLM.
|
|
212
|
+
|
|
213
|
+
Use the `setMeters` and `addMeters` static methods to set meter values
|
|
214
|
+
programmatically at runtime from a custom policy or handler:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import { MonetizationInboundPolicy } from "@zuplo/runtime";
|
|
218
|
+
|
|
219
|
+
// In a custom outbound policy, set meters based on the response
|
|
220
|
+
export default async function meterTokens(response, request, context) {
|
|
221
|
+
if (response.ok) {
|
|
222
|
+
const body = await response.json();
|
|
223
|
+
const tokens = body.usage?.total_tokens ?? 0;
|
|
224
|
+
|
|
225
|
+
MonetizationInboundPolicy.setMeters(context, {
|
|
226
|
+
tokens_used: tokens,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return response;
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
You can also use `addMeters` to add to existing meter values rather than
|
|
234
|
+
replacing them:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
MonetizationInboundPolicy.addMeters(context, {
|
|
238
|
+
api_credits: creditsConsumed,
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
You can also read the current runtime meter values at any point:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const meters = MonetizationInboundPolicy.getMeters(context);
|
|
246
|
+
// { tokens_used: 150 }
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### How meter values are merged
|
|
250
|
+
|
|
251
|
+
The final metering hook combines static and runtime values before usage is sent:
|
|
252
|
+
|
|
253
|
+
- `options.meters` provides the static base values
|
|
254
|
+
- `setMeters` replaces the current runtime meter map, overriding matching static
|
|
255
|
+
keys
|
|
256
|
+
- `addMeters` accumulates into the runtime meter map, then combines additively
|
|
257
|
+
with static values
|
|
258
|
+
- If both static and runtime maps are empty, metering is skipped
|
|
259
|
+
|
|
260
|
+
For a meter key like `api` with `options.meters.api = 1`:
|
|
261
|
+
|
|
262
|
+
- `setMeters(context, { api: 50 })` sends `api: 50` (replaces static value)
|
|
263
|
+
- `addMeters(context, { api: 50 })` sends `api: 51` (adds to static value)
|
|
264
|
+
|
|
265
|
+
## Error responses
|
|
266
|
+
|
|
267
|
+
The policy returns `403 Forbidden` for all error conditions. Responses follow
|
|
268
|
+
the RFC 7807 Problem Details format:
|
|
269
|
+
|
|
270
|
+
```json
|
|
271
|
+
{
|
|
272
|
+
"type": "https://httpproblems.com/http-status/403",
|
|
273
|
+
"title": "Forbidden",
|
|
274
|
+
"status": 403,
|
|
275
|
+
"detail": "API Key has exceeded the allowed limit for \"api_requests\" meter.",
|
|
276
|
+
"instance": "/api/v1/resource",
|
|
277
|
+
"trace": {
|
|
278
|
+
"timestamp": "2026-01-15T10:00:00Z",
|
|
279
|
+
"requestId": "req_abc123",
|
|
280
|
+
"buildId": "build_xyz"
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Common error details:
|
|
286
|
+
|
|
287
|
+
| Condition | `detail` message |
|
|
288
|
+
| ------------------------- | ------------------------------------------------------------------- |
|
|
289
|
+
| No auth header | `"No Authorization Header"` |
|
|
290
|
+
| Wrong auth scheme | `"Invalid Authorization Scheme"` |
|
|
291
|
+
| Invalid API key | `"API Key is invalid or does not have access to the API"` |
|
|
292
|
+
| Expired API key | `"API Key has expired."` |
|
|
293
|
+
| Expired subscription | `"API Key has an expired subscription."` |
|
|
294
|
+
| Payment not made | `"Payment has not been made."` |
|
|
295
|
+
| Payment overdue | `"Payment is overdue. Please update your payment method."` |
|
|
296
|
+
| Quota exhausted | `"API Key has exceeded the allowed limit for \"X\" meter."` |
|
|
297
|
+
| Meter not in subscription | `"API Key does not have \"X\" meter provided by the subscription."` |
|
|
298
|
+
|
|
299
|
+
## Pipeline ordering
|
|
300
|
+
|
|
301
|
+
The monetization policy should be the first policy in the inbound pipeline since
|
|
302
|
+
it handles authentication:
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
1. monetization-inbound → Authenticates, checks subscription, enforces quota, meters usage
|
|
306
|
+
2. rate-limiting → (Optional) Per-second/per-minute spike protection
|
|
307
|
+
3. caching → (Optional) Response caching
|
|
308
|
+
4. → Route handler → Your API logic
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
If you still want per-second or per-minute rate limiting on top of monthly
|
|
312
|
+
quotas, add a standalone rate-limiting policy after the monetization policy.
|
|
313
|
+
These serve different purposes: monetization enforces billing quotas, while rate
|
|
314
|
+
limiting protects against traffic spikes.
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Plan Examples
|
|
3
|
+
sidebar_label: Plan Examples
|
|
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 walks through progressively building a plan, starting simple and
|
|
16
|
+
adding complexity. All examples assume you have already created:
|
|
17
|
+
|
|
18
|
+
- A meter called `api_requests` that tracks API calls
|
|
19
|
+
- A feature called `api_requests` linked to that meter
|
|
20
|
+
|
|
21
|
+
## 1. Basic Fixed Monthly Plan
|
|
22
|
+
|
|
23
|
+
A simple plan with a flat $9.99/month fee and 1,000 API requests included.
|
|
24
|
+
|
|
25
|
+
```shell
|
|
26
|
+
curl \
|
|
27
|
+
https://dev.zuplo.com/v3/metering/$BUCKET_ID/plans \
|
|
28
|
+
--request POST \
|
|
29
|
+
--header "Authorization: Bearer $ZAPI_KEY" \
|
|
30
|
+
--header "Content-Type: application/json" \
|
|
31
|
+
--data @- << EOF
|
|
32
|
+
{
|
|
33
|
+
"key": "starter",
|
|
34
|
+
"name": "Starter Plan",
|
|
35
|
+
"description": "1,000 API requests per month",
|
|
36
|
+
"currency": "USD",
|
|
37
|
+
"billingCadence": "P1M",
|
|
38
|
+
"phases": [
|
|
39
|
+
{
|
|
40
|
+
"key": "default",
|
|
41
|
+
"name": "Default",
|
|
42
|
+
"duration": null,
|
|
43
|
+
"rateCards": [
|
|
44
|
+
{
|
|
45
|
+
"type": "flat_fee",
|
|
46
|
+
"key": "api_requests",
|
|
47
|
+
"name": "API Requests",
|
|
48
|
+
"featureKey": "api_requests",
|
|
49
|
+
"billingCadence": "P1M",
|
|
50
|
+
"price": {
|
|
51
|
+
"type": "flat",
|
|
52
|
+
"amount": "9.99"
|
|
53
|
+
},
|
|
54
|
+
"entitlementTemplate": {
|
|
55
|
+
"type": "metered",
|
|
56
|
+
"issueAfterReset": 1000,
|
|
57
|
+
"isSoftLimit": false,
|
|
58
|
+
"usagePeriod": "P1M"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
EOF
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**What this does:**
|
|
69
|
+
|
|
70
|
+
- Charges $9.99 at the start of each month
|
|
71
|
+
- Grants 1,000 API requests per month
|
|
72
|
+
- Hard limit (`isSoftLimit: false`) - requests are blocked after 1,000
|
|
73
|
+
|
|
74
|
+
## 2. Add a Free Trial
|
|
75
|
+
|
|
76
|
+
Building on the previous example, add a 2-week free trial with 1,000 requests.
|
|
77
|
+
|
|
78
|
+
```shell
|
|
79
|
+
curl \
|
|
80
|
+
https://dev.zuplo.com/v3/metering/$BUCKET_ID/plans \
|
|
81
|
+
--request POST \
|
|
82
|
+
--header "Authorization: Bearer $ZAPI_KEY" \
|
|
83
|
+
--header "Content-Type: application/json" \
|
|
84
|
+
--data @- << EOF
|
|
85
|
+
{
|
|
86
|
+
"key": "starter",
|
|
87
|
+
"name": "Starter Plan",
|
|
88
|
+
"description": "1,000 API requests per month with 2-week free trial",
|
|
89
|
+
"currency": "USD",
|
|
90
|
+
"billingCadence": "P1M",
|
|
91
|
+
"phases": [
|
|
92
|
+
{
|
|
93
|
+
"key": "trial",
|
|
94
|
+
"name": "Free Trial",
|
|
95
|
+
"duration": "P2W",
|
|
96
|
+
"rateCards": [
|
|
97
|
+
{
|
|
98
|
+
"type": "flat_fee",
|
|
99
|
+
"key": "api_requests",
|
|
100
|
+
"name": "API Requests (Trial)",
|
|
101
|
+
"featureKey": "api_requests",
|
|
102
|
+
"billingCadence": null,
|
|
103
|
+
"price": null,
|
|
104
|
+
"entitlementTemplate": {
|
|
105
|
+
"type": "metered",
|
|
106
|
+
"issueAfterReset": 1000,
|
|
107
|
+
"isSoftLimit": false,
|
|
108
|
+
"usagePeriod": "P2W"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"key": "default",
|
|
115
|
+
"name": "Default",
|
|
116
|
+
"duration": null,
|
|
117
|
+
"rateCards": [
|
|
118
|
+
{
|
|
119
|
+
"type": "flat_fee",
|
|
120
|
+
"key": "api_requests",
|
|
121
|
+
"name": "API Requests",
|
|
122
|
+
"featureKey": "api_requests",
|
|
123
|
+
"billingCadence": "P1M",
|
|
124
|
+
"price": {
|
|
125
|
+
"type": "flat",
|
|
126
|
+
"amount": "9.99"
|
|
127
|
+
},
|
|
128
|
+
"entitlementTemplate": {
|
|
129
|
+
"type": "metered",
|
|
130
|
+
"issueAfterReset": 1000,
|
|
131
|
+
"isSoftLimit": false,
|
|
132
|
+
"usagePeriod": "P1M"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
EOF
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**What changed:**
|
|
143
|
+
|
|
144
|
+
- Added a `trial` phase with `duration: "P2W"` (2 weeks)
|
|
145
|
+
- Trial phase has `price: null` and `billingCadence: null` - it's free
|
|
146
|
+
- After 2 weeks, customer automatically moves to the `default` phase
|
|
147
|
+
|
|
148
|
+
## 3. Add Overage Charges
|
|
149
|
+
|
|
150
|
+
Now allow customers to exceed their quota and charge $0.01 per additional
|
|
151
|
+
request after the first 1,000.
|
|
152
|
+
|
|
153
|
+
```shell
|
|
154
|
+
curl \
|
|
155
|
+
https://dev.zuplo.com/v3/metering/$BUCKET_ID/plans \
|
|
156
|
+
--request POST \
|
|
157
|
+
--header "Authorization: Bearer $ZAPI_KEY" \
|
|
158
|
+
--header "Content-Type: application/json" \
|
|
159
|
+
--data @- << EOF
|
|
160
|
+
{
|
|
161
|
+
"key": "starter",
|
|
162
|
+
"name": "Starter Plan",
|
|
163
|
+
"description": "1,000 API requests per month with 2-week free trial and overages",
|
|
164
|
+
"currency": "USD",
|
|
165
|
+
"billingCadence": "P1M",
|
|
166
|
+
"phases": [
|
|
167
|
+
{
|
|
168
|
+
"key": "trial",
|
|
169
|
+
"name": "Free Trial",
|
|
170
|
+
"duration": "P2W",
|
|
171
|
+
"rateCards": [
|
|
172
|
+
{
|
|
173
|
+
"type": "flat_fee",
|
|
174
|
+
"key": "api_requests",
|
|
175
|
+
"name": "API Requests (Trial)",
|
|
176
|
+
"featureKey": "api_requests",
|
|
177
|
+
"billingCadence": null,
|
|
178
|
+
"price": null,
|
|
179
|
+
"entitlementTemplate": {
|
|
180
|
+
"type": "metered",
|
|
181
|
+
"issueAfterReset": 1000,
|
|
182
|
+
"isSoftLimit": false,
|
|
183
|
+
"usagePeriod": "P2W"
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"key": "default",
|
|
190
|
+
"name": "Default",
|
|
191
|
+
"duration": null,
|
|
192
|
+
"rateCards": [
|
|
193
|
+
{
|
|
194
|
+
"type": "usage_based",
|
|
195
|
+
"key": "api_requests",
|
|
196
|
+
"name": "API Requests",
|
|
197
|
+
"featureKey": "api_requests",
|
|
198
|
+
"billingCadence": "P1M",
|
|
199
|
+
"entitlementTemplate": {
|
|
200
|
+
"type": "metered",
|
|
201
|
+
"issueAfterReset": 1000,
|
|
202
|
+
"isSoftLimit": true,
|
|
203
|
+
"usagePeriod": "P1M"
|
|
204
|
+
},
|
|
205
|
+
"price": {
|
|
206
|
+
"type": "tiered",
|
|
207
|
+
"mode": "graduated",
|
|
208
|
+
"tiers": [
|
|
209
|
+
{
|
|
210
|
+
"upToAmount": "1000",
|
|
211
|
+
"flatPrice": { "type": "flat", "amount": "9.99" },
|
|
212
|
+
"unitPrice": null
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"flatPrice": null,
|
|
216
|
+
"unitPrice": { "type": "unit", "amount": "0.01" }
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
EOF
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**What changed:**
|
|
229
|
+
|
|
230
|
+
- Changed the rate card from `flat_fee` to `usage_based`
|
|
231
|
+
- Changed `isSoftLimit` to `true` - requests continue after 1,000
|
|
232
|
+
- Combined base fee and overage into tiered pricing: first 1,000 cost $9.99
|
|
233
|
+
flat, then $0.01 per additional request
|
|
234
|
+
|
|
235
|
+
**Example billing:**
|
|
236
|
+
|
|
237
|
+
| Usage | Base Fee | Overage | Total |
|
|
238
|
+
| ----- | -------- | ------------------- | ------ |
|
|
239
|
+
| 500 | $9.99 | $0 | $9.99 |
|
|
240
|
+
| 1,000 | $9.99 | $0 | $9.99 |
|
|
241
|
+
| 1,500 | $9.99 | 500 × $0.01 = $5 | $14.99 |
|
|
242
|
+
| 5,000 | $9.99 | 4,000 × $0.01 = $40 | $49.99 |
|
|
243
|
+
|
|
244
|
+
## 4. Add Static Entitlements
|
|
245
|
+
|
|
246
|
+
Finally, add a static entitlement for "large payloads" that grants premium
|
|
247
|
+
features without metering.
|
|
248
|
+
|
|
249
|
+
:::note
|
|
250
|
+
|
|
251
|
+
Before adding the `large_payloads` rate card, you must first create a feature
|
|
252
|
+
with `key: "large_payloads"`.
|
|
253
|
+
|
|
254
|
+
:::
|
|
255
|
+
|
|
256
|
+
```shell
|
|
257
|
+
curl \
|
|
258
|
+
https://dev.zuplo.com/v3/metering/$BUCKET_ID/plans \
|
|
259
|
+
--request POST \
|
|
260
|
+
--header "Authorization: Bearer $ZAPI_KEY" \
|
|
261
|
+
--header "Content-Type: application/json" \
|
|
262
|
+
--data @- << EOF
|
|
263
|
+
{
|
|
264
|
+
"key": "starter",
|
|
265
|
+
"name": "Starter Plan",
|
|
266
|
+
"description": "1,000 API requests per month with 2-week free trial and overages",
|
|
267
|
+
"currency": "USD",
|
|
268
|
+
"billingCadence": "P1M",
|
|
269
|
+
"phases": [
|
|
270
|
+
{
|
|
271
|
+
"key": "trial",
|
|
272
|
+
"name": "Free Trial",
|
|
273
|
+
"duration": "P2W",
|
|
274
|
+
"rateCards": [
|
|
275
|
+
{
|
|
276
|
+
"type": "flat_fee",
|
|
277
|
+
"key": "api_requests",
|
|
278
|
+
"name": "API Requests (Trial)",
|
|
279
|
+
"featureKey": "api_requests",
|
|
280
|
+
"billingCadence": null,
|
|
281
|
+
"price": null,
|
|
282
|
+
"entitlementTemplate": {
|
|
283
|
+
"type": "metered",
|
|
284
|
+
"issueAfterReset": 1000,
|
|
285
|
+
"isSoftLimit": false,
|
|
286
|
+
"usagePeriod": "P2W"
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"type": "flat_fee",
|
|
291
|
+
"key": "large_payloads",
|
|
292
|
+
"name": "Large Payloads (Trial)",
|
|
293
|
+
"featureKey": "large_payloads",
|
|
294
|
+
"billingCadence": null,
|
|
295
|
+
"price": null,
|
|
296
|
+
"entitlementTemplate": {
|
|
297
|
+
"type": "boolean",
|
|
298
|
+
"config": true
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"key": "default",
|
|
305
|
+
"name": "Default",
|
|
306
|
+
"duration": null,
|
|
307
|
+
"rateCards": [
|
|
308
|
+
{
|
|
309
|
+
"type": "usage_based",
|
|
310
|
+
"key": "api_requests",
|
|
311
|
+
"name": "API Requests",
|
|
312
|
+
"featureKey": "api_requests",
|
|
313
|
+
"billingCadence": "P1M",
|
|
314
|
+
"entitlementTemplate": {
|
|
315
|
+
"type": "metered",
|
|
316
|
+
"issueAfterReset": 1000,
|
|
317
|
+
"isSoftLimit": true,
|
|
318
|
+
"usagePeriod": "P1M"
|
|
319
|
+
},
|
|
320
|
+
"price": {
|
|
321
|
+
"type": "tiered",
|
|
322
|
+
"mode": "graduated",
|
|
323
|
+
"tiers": [
|
|
324
|
+
{
|
|
325
|
+
"upToAmount": "1000",
|
|
326
|
+
"flatPrice": { "type": "flat", "amount": "9.99" },
|
|
327
|
+
"unitPrice": null
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"flatPrice": null,
|
|
331
|
+
"unitPrice": { "type": "unit", "amount": "0.01" }
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"type": "flat_fee",
|
|
338
|
+
"key": "large_payloads",
|
|
339
|
+
"name": "Large Payloads",
|
|
340
|
+
"featureKey": "large_payloads",
|
|
341
|
+
"billingCadence": null,
|
|
342
|
+
"price": null,
|
|
343
|
+
"entitlementTemplate": {
|
|
344
|
+
"type": "boolean",
|
|
345
|
+
"config": true
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
EOF
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**What changed:**
|
|
356
|
+
|
|
357
|
+
- Added `large_payloads` rate card to both phases
|
|
358
|
+
- Uses `type: "boolean"` with `config: true` to grant the feature
|
|
359
|
+
- No meter required - this is a static on/off entitlement
|
|
360
|
+
|
|
361
|
+
**Final plan summary:**
|
|
362
|
+
|
|
363
|
+
| Phase | Duration | API Requests | Large Payloads | Cost |
|
|
364
|
+
| ------- | -------- | ------------------ | -------------- | ----------- |
|
|
365
|
+
| Trial | 2 weeks | 1,000 (hard limit) | Enabled | Free |
|
|
366
|
+
| Default | Ongoing | 1,000 + overages | Enabled | $9.99/month |
|