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.
Files changed (644) hide show
  1. package/README.md +9 -0
  2. package/docs/_index.md +44 -0
  3. package/docs/ai-gateway/apps.mdx +28 -0
  4. package/docs/ai-gateway/custom-providers.mdx +54 -0
  5. package/docs/ai-gateway/getting-started.mdx +224 -0
  6. package/docs/ai-gateway/guardrails.mdx +65 -0
  7. package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
  8. package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
  9. package/docs/ai-gateway/integrations/codex.mdx +78 -0
  10. package/docs/ai-gateway/integrations/goose.mdx +104 -0
  11. package/docs/ai-gateway/integrations/langchain.mdx +66 -0
  12. package/docs/ai-gateway/integrations/openai.mdx +99 -0
  13. package/docs/ai-gateway/introduction.mdx +85 -0
  14. package/docs/ai-gateway/managing-apps.mdx +46 -0
  15. package/docs/ai-gateway/managing-providers.mdx +66 -0
  16. package/docs/ai-gateway/managing-teams.mdx +63 -0
  17. package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
  18. package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
  19. package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
  20. package/docs/ai-gateway/providers.mdx +32 -0
  21. package/docs/ai-gateway/teams.mdx +38 -0
  22. package/docs/ai-gateway/universal-api.mdx +43 -0
  23. package/docs/ai-gateway/usage-limits.mdx +89 -0
  24. package/docs/api-management/introduction.md +127 -0
  25. package/docs/articles/accounts/audit-logs.mdx +227 -0
  26. package/docs/articles/accounts/billing.mdx +25 -0
  27. package/docs/articles/accounts/default-api-key.mdx +30 -0
  28. package/docs/articles/accounts/delete-account.mdx +36 -0
  29. package/docs/articles/accounts/enterprise-sso.mdx +116 -0
  30. package/docs/articles/accounts/managing-account-members.mdx +45 -0
  31. package/docs/articles/accounts/managing-project-members.mdx +37 -0
  32. package/docs/articles/accounts/members-and-roles.mdx +21 -0
  33. package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
  34. package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
  35. package/docs/articles/add-api-to-backstage.mdx +216 -0
  36. package/docs/articles/advanced-path-matching.mdx +139 -0
  37. package/docs/articles/api-key-administration.mdx +47 -0
  38. package/docs/articles/api-key-api.mdx +220 -0
  39. package/docs/articles/api-key-authentication.mdx +195 -0
  40. package/docs/articles/api-key-buckets.mdx +61 -0
  41. package/docs/articles/api-key-end-users.mdx +52 -0
  42. package/docs/articles/api-key-leak-detection.mdx +75 -0
  43. package/docs/articles/api-key-management.mdx +100 -0
  44. package/docs/articles/api-key-react-component.mdx +90 -0
  45. package/docs/articles/api-key-service-limits.mdx +14 -0
  46. package/docs/articles/archiving-requests-to-storage.mdx +119 -0
  47. package/docs/articles/branch-based-deployments.mdx +184 -0
  48. package/docs/articles/bypass-policy-for-testing.mdx +117 -0
  49. package/docs/articles/check-ip-address.mdx +17 -0
  50. package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
  51. package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
  52. package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
  53. package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
  54. package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
  55. package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
  56. package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
  57. package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
  58. package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
  59. package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
  60. package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
  61. package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
  62. package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
  63. package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
  64. package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
  65. package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
  66. package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
  67. package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
  68. package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
  69. package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
  70. package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
  71. package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
  72. package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
  73. package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
  74. package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
  75. package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
  76. package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
  77. package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
  78. package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
  79. package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
  80. package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
  81. package/docs/articles/composite-policy-reference.mdx +284 -0
  82. package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
  83. package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
  84. package/docs/articles/convert-urls-to-openapi.mdx +62 -0
  85. package/docs/articles/cors.mdx +447 -0
  86. package/docs/articles/custom-audit-log-policy.mdx +95 -0
  87. package/docs/articles/custom-ci-cd-azure.mdx +81 -0
  88. package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
  89. package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
  90. package/docs/articles/custom-ci-cd-github.mdx +99 -0
  91. package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
  92. package/docs/articles/custom-ci-cd.mdx +82 -0
  93. package/docs/articles/custom-code-patterns.md +418 -0
  94. package/docs/articles/custom-domains.mdx +258 -0
  95. package/docs/articles/custom-logging-example.mdx +139 -0
  96. package/docs/articles/ddos-protection.mdx +138 -0
  97. package/docs/articles/development-options.mdx +49 -0
  98. package/docs/articles/environment-variables.mdx +134 -0
  99. package/docs/articles/environments.mdx +143 -0
  100. package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
  101. package/docs/articles/github-deployment-testing.mdx +101 -0
  102. package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
  103. package/docs/articles/graphql-security.mdx +180 -0
  104. package/docs/articles/handling-form-data.mdx +61 -0
  105. package/docs/articles/health-checks.mdx +109 -0
  106. package/docs/articles/hosting-options.mdx +70 -0
  107. package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
  108. package/docs/articles/limits.mdx +98 -0
  109. package/docs/articles/local-development-debugging.mdx +44 -0
  110. package/docs/articles/local-development-env-variables.mdx +23 -0
  111. package/docs/articles/local-development-installing-packages.mdx +23 -0
  112. package/docs/articles/local-development-routes-designer.mdx +27 -0
  113. package/docs/articles/local-development-services.mdx +40 -0
  114. package/docs/articles/local-development-troubleshooting.mdx +56 -0
  115. package/docs/articles/local-development.mdx +81 -0
  116. package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
  117. package/docs/articles/log-plugin-datadog.mdx +84 -0
  118. package/docs/articles/log-plugin-dynatrace.mdx +75 -0
  119. package/docs/articles/log-plugin-gcp.mdx +75 -0
  120. package/docs/articles/log-plugin-loki.mdx +136 -0
  121. package/docs/articles/log-plugin-new-relic.mdx +84 -0
  122. package/docs/articles/log-plugin-splunk.mdx +104 -0
  123. package/docs/articles/log-plugin-sumo.mdx +73 -0
  124. package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
  125. package/docs/articles/log-request-response-data.mdx +398 -0
  126. package/docs/articles/logging.mdx +115 -0
  127. package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
  128. package/docs/articles/mcp-quickstart.mdx +135 -0
  129. package/docs/articles/metrics-plugins.mdx +371 -0
  130. package/docs/articles/migrate-from-apigee.md +408 -0
  131. package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
  132. package/docs/articles/migrate-from-azure-apim.md +292 -0
  133. package/docs/articles/migrate-from-kong.md +300 -0
  134. package/docs/articles/migration-overview.md +81 -0
  135. package/docs/articles/monetization/api-access.mdx +69 -0
  136. package/docs/articles/monetization/billing-models.md +520 -0
  137. package/docs/articles/monetization/developer-portal.md +167 -0
  138. package/docs/articles/monetization/features.mdx +98 -0
  139. package/docs/articles/monetization/index.mdx +113 -0
  140. package/docs/articles/monetization/meters.mdx +135 -0
  141. package/docs/articles/monetization/monetization-policy.md +314 -0
  142. package/docs/articles/monetization/plan-examples.mdx +366 -0
  143. package/docs/articles/monetization/plans.mdx +266 -0
  144. package/docs/articles/monetization/pricing-models.mdx +225 -0
  145. package/docs/articles/monetization/private-plans.md +154 -0
  146. package/docs/articles/monetization/quickstart.md +355 -0
  147. package/docs/articles/monetization/rate-cards.mdx +171 -0
  148. package/docs/articles/monetization/stripe-integration.md +195 -0
  149. package/docs/articles/monetization/subscription-lifecycle.md +298 -0
  150. package/docs/articles/monetization/tax-collection.md +166 -0
  151. package/docs/articles/monetization/troubleshooting.md +272 -0
  152. package/docs/articles/monetization-custom.mdx +71 -0
  153. package/docs/articles/monetization-integrations.mdx +104 -0
  154. package/docs/articles/monitoring-your-gateway.mdx +53 -0
  155. package/docs/articles/monorepo-deployment.mdx +350 -0
  156. package/docs/articles/multiple-auth-policies.mdx +81 -0
  157. package/docs/articles/non-standard-ports.mdx +30 -0
  158. package/docs/articles/oauth-authentication.mdx +54 -0
  159. package/docs/articles/openapi-server-urls.mdx +60 -0
  160. package/docs/articles/openapi.mdx +130 -0
  161. package/docs/articles/opentelemetry.mdx +250 -0
  162. package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
  163. package/docs/articles/performance-testing.mdx +304 -0
  164. package/docs/articles/plugin-akamai-api-security.mdx +76 -0
  165. package/docs/articles/plugin-azure-blob.mdx +73 -0
  166. package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
  167. package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
  168. package/docs/articles/policies.mdx +33 -0
  169. package/docs/articles/rename-or-move-project.mdx +39 -0
  170. package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
  171. package/docs/articles/routing.mdx +193 -0
  172. package/docs/articles/s3-signed-url-uploads.mdx +521 -0
  173. package/docs/articles/secure-tunnel.mdx +84 -0
  174. package/docs/articles/securing-backend-mtls.mdx +268 -0
  175. package/docs/articles/securing-your-backend.mdx +148 -0
  176. package/docs/articles/security.mdx +105 -0
  177. package/docs/articles/sharing-code-across-projects.mdx +412 -0
  178. package/docs/articles/source-control-setup-azure.mdx +13 -0
  179. package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
  180. package/docs/articles/source-control-setup-github.mdx +172 -0
  181. package/docs/articles/source-control-setup-gitlab.mdx +12 -0
  182. package/docs/articles/source-control.mdx +80 -0
  183. package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
  184. package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
  185. package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
  186. package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
  187. package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
  188. package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
  189. package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
  190. package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
  191. package/docs/articles/support.mdx +144 -0
  192. package/docs/articles/terraform.mdx +114 -0
  193. package/docs/articles/testing-graphql.mdx +34 -0
  194. package/docs/articles/testing.mdx +522 -0
  195. package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
  196. package/docs/articles/troubleshooting.md +302 -0
  197. package/docs/articles/tsconfig.mdx +105 -0
  198. package/docs/articles/tunnel-setup.mdx +195 -0
  199. package/docs/articles/tunnel-troubleshooting.mdx +50 -0
  200. package/docs/articles/update-zup-in-github-action.mdx +110 -0
  201. package/docs/articles/use-openapi-extension-data.mdx +79 -0
  202. package/docs/articles/users/multifactor-authentication.mdx +64 -0
  203. package/docs/articles/users/profile.mdx +13 -0
  204. package/docs/articles/versioning-on-zuplo.mdx +89 -0
  205. package/docs/articles/waf-ddos-akamai.md +133 -0
  206. package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
  207. package/docs/articles/waf-ddos-fastly.mdx +251 -0
  208. package/docs/articles/waf-ddos.mdx +140 -0
  209. package/docs/articles/zuplo-waf.mdx +156 -0
  210. package/docs/ask.mdx +3 -0
  211. package/docs/cli/authentication.mdx +56 -0
  212. package/docs/cli/connectivity.mdx +38 -0
  213. package/docs/cli/create-zuplo-api.mdx +80 -0
  214. package/docs/cli/delete.mdx +79 -0
  215. package/docs/cli/deploy.mdx +156 -0
  216. package/docs/cli/deploy.partial.mdx +46 -0
  217. package/docs/cli/dev.mdx +115 -0
  218. package/docs/cli/docs.mdx +66 -0
  219. package/docs/cli/editor.mdx +50 -0
  220. package/docs/cli/global-options.mdx +19 -0
  221. package/docs/cli/init.mdx +74 -0
  222. package/docs/cli/link.mdx +74 -0
  223. package/docs/cli/list.mdx +55 -0
  224. package/docs/cli/mtls-certificate-create.mdx +94 -0
  225. package/docs/cli/mtls-certificate-delete.mdx +55 -0
  226. package/docs/cli/mtls-certificate-describe.mdx +55 -0
  227. package/docs/cli/mtls-certificate-disable.mdx +55 -0
  228. package/docs/cli/mtls-certificate-list.mdx +47 -0
  229. package/docs/cli/mtls-certificate-update.mdx +72 -0
  230. package/docs/cli/openapi-convert.mdx +111 -0
  231. package/docs/cli/openapi-merge.mdx +138 -0
  232. package/docs/cli/openapi-merge.partial.mdx +29 -0
  233. package/docs/cli/openapi-overlay.mdx +123 -0
  234. package/docs/cli/overview.mdx +78 -0
  235. package/docs/cli/project-create.mdx +43 -0
  236. package/docs/cli/source-migrate.mdx +18 -0
  237. package/docs/cli/source-upgrade.mdx +41 -0
  238. package/docs/cli/test.mdx +70 -0
  239. package/docs/cli/test.partial.mdx +7 -0
  240. package/docs/cli/tunnel-create.mdx +53 -0
  241. package/docs/cli/tunnel-create.partial.mdx +9 -0
  242. package/docs/cli/tunnel-delete.mdx +35 -0
  243. package/docs/cli/tunnel-delete.partial.mdx +9 -0
  244. package/docs/cli/tunnel-describe.mdx +45 -0
  245. package/docs/cli/tunnel-describe.partial.mdx +5 -0
  246. package/docs/cli/tunnel-list.mdx +35 -0
  247. package/docs/cli/tunnel-list.partial.mdx +9 -0
  248. package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
  249. package/docs/cli/tunnel-rotate-token.mdx +39 -0
  250. package/docs/cli/tunnel-services-describe.mdx +45 -0
  251. package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
  252. package/docs/cli/tunnel-services-update.mdx +48 -0
  253. package/docs/cli/variable-create.mdx +91 -0
  254. package/docs/cli/variable-create.partial.mdx +5 -0
  255. package/docs/cli/variable-update.mdx +75 -0
  256. package/docs/cli/variable-update.partial.mdx +5 -0
  257. package/docs/concepts/api-keys.md +146 -0
  258. package/docs/concepts/authentication.mdx +109 -0
  259. package/docs/concepts/how-zuplo-works.mdx +120 -0
  260. package/docs/concepts/project-structure.mdx +174 -0
  261. package/docs/concepts/rate-limiting.md +246 -0
  262. package/docs/concepts/request-lifecycle.mdx +56 -0
  263. package/docs/concepts/source-control-and-deployment.mdx +229 -0
  264. package/docs/conferences/conference-prize-terms.mdx +80 -0
  265. package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
  266. package/docs/dedicated/akamai/architecture.mdx +280 -0
  267. package/docs/dedicated/akamai/caching.mdx +212 -0
  268. package/docs/dedicated/akamai/cdn.mdx +156 -0
  269. package/docs/dedicated/architecture.mdx +208 -0
  270. package/docs/dedicated/custom-domains.mdx +31 -0
  271. package/docs/dedicated/federated-gateways.mdx +80 -0
  272. package/docs/dedicated/networking.mdx +69 -0
  273. package/docs/dedicated/overview.mdx +80 -0
  274. package/docs/dedicated/source-control.mdx +63 -0
  275. package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
  276. package/docs/dev-portal/introduction.mdx +65 -0
  277. package/docs/dev-portal/local-development.mdx +72 -0
  278. package/docs/dev-portal/migration.mdx +526 -0
  279. package/docs/dev-portal/node-modules.mdx +45 -0
  280. package/docs/dev-portal/updating.mdx +28 -0
  281. package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
  282. package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
  283. package/docs/dev-portal/zudoku/components/button.mdx +132 -0
  284. package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
  285. package/docs/dev-portal/zudoku/components/card.mdx +104 -0
  286. package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
  287. package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
  288. package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
  289. package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
  290. package/docs/dev-portal/zudoku/components/head.mdx +199 -0
  291. package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
  292. package/docs/dev-portal/zudoku/components/input.mdx +96 -0
  293. package/docs/dev-portal/zudoku/components/label.mdx +86 -0
  294. package/docs/dev-portal/zudoku/components/link.mdx +242 -0
  295. package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
  296. package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
  297. package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
  298. package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
  299. package/docs/dev-portal/zudoku/components/select.mdx +176 -0
  300. package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
  301. package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
  302. package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
  303. package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
  304. package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
  305. package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
  306. package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
  307. package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
  308. package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
  309. package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
  310. package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
  311. package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
  312. package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
  313. package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
  314. package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
  315. package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
  316. package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
  317. package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
  318. package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
  319. package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
  320. package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
  321. package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
  322. package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
  323. package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
  324. package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
  325. package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
  326. package/docs/dev-portal/zudoku/configuration/search.md +169 -0
  327. package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
  328. package/docs/dev-portal/zudoku/configuration/site.md +124 -0
  329. package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
  330. package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
  331. package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
  332. package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
  333. package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
  334. package/docs/dev-portal/zudoku/extending/events.md +124 -0
  335. package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
  336. package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
  337. package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
  338. package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
  339. package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
  340. package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
  341. package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
  342. package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
  343. package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
  344. package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
  345. package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
  346. package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
  347. package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
  348. package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
  349. package/docs/dev-portal/zudoku/plugins.md +5 -0
  350. package/docs/dev-portal/zudoku/writing.mdx +72 -0
  351. package/docs/errors/bad-request.mdx +39 -0
  352. package/docs/errors/build-error.mdx +45 -0
  353. package/docs/errors/fatal-project-error.mdx +39 -0
  354. package/docs/errors/gateway-timeout.mdx +33 -0
  355. package/docs/errors/get-head-body-error.mdx +41 -0
  356. package/docs/errors/main-mod-error.mdx +40 -0
  357. package/docs/errors/no-project-set.mdx +41 -0
  358. package/docs/errors/not-found.mdx +43 -0
  359. package/docs/errors/rate-limit-exceeded.mdx +31 -0
  360. package/docs/errors/schema-validation-failed.mdx +51 -0
  361. package/docs/errors/system-configuration-error.mdx +44 -0
  362. package/docs/errors/unauthorized.mdx +50 -0
  363. package/docs/errors/unknown-error.mdx +42 -0
  364. package/docs/errors.mdx +14 -0
  365. package/docs/guides/canary-routing-for-employees.mdx +385 -0
  366. package/docs/guides/geolocation-backend-routing.mdx +404 -0
  367. package/docs/guides/modify-openapi-paths.mdx +371 -0
  368. package/docs/guides/openapi-overlays.mdx +492 -0
  369. package/docs/guides/overview.mdx +12 -0
  370. package/docs/guides/user-based-backend-routing.mdx +437 -0
  371. package/docs/handlers/aws-lambda.mdx +201 -0
  372. package/docs/handlers/custom-handler.mdx +112 -0
  373. package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
  374. package/docs/handlers/mcp-server.mdx +730 -0
  375. package/docs/handlers/openapi.mdx +78 -0
  376. package/docs/handlers/redirect.mdx +115 -0
  377. package/docs/handlers/system-handlers.mdx +41 -0
  378. package/docs/handlers/url-forward.mdx +204 -0
  379. package/docs/handlers/url-rewrite.mdx +224 -0
  380. package/docs/handlers/websocket-handler.mdx +154 -0
  381. package/docs/home.mdx +6 -0
  382. package/docs/managed-edge/overview.md +78 -0
  383. package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
  384. package/docs/mcp-server/custom-tools.mdx +487 -0
  385. package/docs/mcp-server/graphql.mdx +241 -0
  386. package/docs/mcp-server/introduction.mdx +122 -0
  387. package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
  388. package/docs/mcp-server/prompts.mdx +283 -0
  389. package/docs/mcp-server/resources.mdx +288 -0
  390. package/docs/mcp-server/testing.mdx +53 -0
  391. package/docs/mcp-server/tools.mdx +306 -0
  392. package/docs/policies/_index.md +92 -0
  393. package/docs/policies/ab-test-inbound/intro.md +8 -0
  394. package/docs/policies/ab-test-inbound/policy.ts +14 -0
  395. package/docs/policies/ab-test-inbound/schema.json +27 -0
  396. package/docs/policies/ab-test-outbound/intro.md +8 -0
  397. package/docs/policies/ab-test-outbound/policy.ts +26 -0
  398. package/docs/policies/ab-test-outbound/schema.json +27 -0
  399. package/docs/policies/acl-policy-inbound/intro.md +5 -0
  400. package/docs/policies/acl-policy-inbound/policy.ts +32 -0
  401. package/docs/policies/acl-policy-inbound/schema.json +52 -0
  402. package/docs/policies/akamai-ai-firewall/schema.json +98 -0
  403. package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
  404. package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
  405. package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
  406. package/docs/policies/api-key-inbound/doc.md +77 -0
  407. package/docs/policies/api-key-inbound/intro.md +30 -0
  408. package/docs/policies/api-key-inbound/schema.json +84 -0
  409. package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
  410. package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
  411. package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
  412. package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
  413. package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
  414. package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
  415. package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
  416. package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
  417. package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
  418. package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
  419. package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
  420. package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
  421. package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
  422. package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
  423. package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
  424. package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
  425. package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
  426. package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
  427. package/docs/policies/audit-log-inbound/doc.md +78 -0
  428. package/docs/policies/audit-log-inbound/intro.md +10 -0
  429. package/docs/policies/audit-log-inbound/schema.json +81 -0
  430. package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
  431. package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
  432. package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
  433. package/docs/policies/authzen-inbound/doc.md +24 -0
  434. package/docs/policies/authzen-inbound/intro.md +31 -0
  435. package/docs/policies/authzen-inbound/schema.json +126 -0
  436. package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
  437. package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
  438. package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
  439. package/docs/policies/basic-auth-inbound/intro.md +9 -0
  440. package/docs/policies/basic-auth-inbound/schema.json +99 -0
  441. package/docs/policies/bot-detection-inbound/intro.md +4 -0
  442. package/docs/policies/bot-detection-inbound/schema.json +56 -0
  443. package/docs/policies/brownout-inbound/doc.md +55 -0
  444. package/docs/policies/brownout-inbound/intro.md +12 -0
  445. package/docs/policies/brownout-inbound/schema.json +115 -0
  446. package/docs/policies/caching-inbound/doc.md +209 -0
  447. package/docs/policies/caching-inbound/intro.md +23 -0
  448. package/docs/policies/caching-inbound/schema.json +98 -0
  449. package/docs/policies/change-method-inbound/schema.json +56 -0
  450. package/docs/policies/clear-headers-inbound/schema.json +59 -0
  451. package/docs/policies/clear-headers-outbound/schema.json +59 -0
  452. package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
  453. package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
  454. package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
  455. package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
  456. package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
  457. package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
  458. package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
  459. package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
  460. package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
  461. package/docs/policies/composite-inbound/doc.md +69 -0
  462. package/docs/policies/composite-inbound/intro.md +15 -0
  463. package/docs/policies/composite-inbound/schema.json +59 -0
  464. package/docs/policies/composite-outbound/intro.md +6 -0
  465. package/docs/policies/composite-outbound/schema.json +59 -0
  466. package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
  467. package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
  468. package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
  469. package/docs/policies/custom-code-inbound/doc.md +267 -0
  470. package/docs/policies/custom-code-inbound/intro.md +2 -0
  471. package/docs/policies/custom-code-inbound/schema.json +48 -0
  472. package/docs/policies/custom-code-outbound/doc.md +235 -0
  473. package/docs/policies/custom-code-outbound/intro.md +2 -0
  474. package/docs/policies/custom-code-outbound/schema.json +43 -0
  475. package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
  476. package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
  477. package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
  478. package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
  479. package/docs/policies/geo-filter-inbound/doc.md +33 -0
  480. package/docs/policies/geo-filter-inbound/schema.json +108 -0
  481. package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
  482. package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
  483. package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
  484. package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
  485. package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
  486. package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
  487. package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
  488. package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
  489. package/docs/policies/hmac-auth-inbound/doc.md +30 -0
  490. package/docs/policies/hmac-auth-inbound/intro.md +10 -0
  491. package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
  492. package/docs/policies/hmac-auth-inbound/schema.json +53 -0
  493. package/docs/policies/http-deprecation-outbound/doc.md +73 -0
  494. package/docs/policies/http-deprecation-outbound/schema.json +83 -0
  495. package/docs/policies/ip-restriction-inbound/intro.md +8 -0
  496. package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
  497. package/docs/policies/ip-restriction-inbound/schema.json +58 -0
  498. package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
  499. package/docs/policies/ldap-auth-inbound/schema.json +56 -0
  500. package/docs/policies/mock-api-inbound/schema.json +72 -0
  501. package/docs/policies/moesif-inbound/doc.md +44 -0
  502. package/docs/policies/moesif-inbound/intro.md +6 -0
  503. package/docs/policies/moesif-inbound/schema.json +68 -0
  504. package/docs/policies/monetization-inbound/doc.md +87 -0
  505. package/docs/policies/monetization-inbound/intro.md +6 -0
  506. package/docs/policies/monetization-inbound/schema.json +102 -0
  507. package/docs/policies/mtls-auth-inbound/intro.md +6 -0
  508. package/docs/policies/mtls-auth-inbound/schema.json +68 -0
  509. package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
  510. package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
  511. package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
  512. package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
  513. package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
  514. package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
  515. package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
  516. package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
  517. package/docs/policies/openfga-authz-inbound/doc.md +207 -0
  518. package/docs/policies/openfga-authz-inbound/intro.md +17 -0
  519. package/docs/policies/openfga-authz-inbound/schema.json +191 -0
  520. package/docs/policies/openmeter-inbound/doc.md +163 -0
  521. package/docs/policies/openmeter-inbound/intro.md +18 -0
  522. package/docs/policies/openmeter-inbound/schema.json +183 -0
  523. package/docs/policies/prompt-injection-outbound/doc.md +106 -0
  524. package/docs/policies/prompt-injection-outbound/intro.md +4 -0
  525. package/docs/policies/prompt-injection-outbound/schema.json +74 -0
  526. package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
  527. package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
  528. package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
  529. package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
  530. package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
  531. package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
  532. package/docs/policies/quota-inbound/doc.md +235 -0
  533. package/docs/policies/quota-inbound/intro.md +7 -0
  534. package/docs/policies/quota-inbound/schema.json +133 -0
  535. package/docs/policies/rate-limit-inbound/doc.md +78 -0
  536. package/docs/policies/rate-limit-inbound/intro.md +30 -0
  537. package/docs/policies/rate-limit-inbound/schema.json +134 -0
  538. package/docs/policies/rbac-policy-inbound/intro.md +3 -0
  539. package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
  540. package/docs/policies/rbac-policy-inbound/schema.json +52 -0
  541. package/docs/policies/readme-metrics-inbound/doc.md +1 -0
  542. package/docs/policies/readme-metrics-inbound/intro.md +3 -0
  543. package/docs/policies/readme-metrics-inbound/schema.json +84 -0
  544. package/docs/policies/remove-headers-inbound/schema.json +59 -0
  545. package/docs/policies/remove-headers-outbound/schema.json +59 -0
  546. package/docs/policies/remove-query-params-inbound/schema.json +59 -0
  547. package/docs/policies/replace-string-outbound/schema.json +69 -0
  548. package/docs/policies/request-size-limit-inbound/schema.json +60 -0
  549. package/docs/policies/request-validation-inbound/doc.md +72 -0
  550. package/docs/policies/request-validation-inbound/intro.md +24 -0
  551. package/docs/policies/request-validation-inbound/schema.json +98 -0
  552. package/docs/policies/require-origin-inbound/intro.md +12 -0
  553. package/docs/policies/require-origin-inbound/schema.json +65 -0
  554. package/docs/policies/secret-masking-outbound/doc.md +41 -0
  555. package/docs/policies/secret-masking-outbound/intro.md +13 -0
  556. package/docs/policies/secret-masking-outbound/schema.json +65 -0
  557. package/docs/policies/semantic-cache-inbound/doc.md +63 -0
  558. package/docs/policies/semantic-cache-inbound/intro.md +4 -0
  559. package/docs/policies/semantic-cache-inbound/schema.json +179 -0
  560. package/docs/policies/set-body-inbound/intro.md +7 -0
  561. package/docs/policies/set-body-inbound/schema.json +56 -0
  562. package/docs/policies/set-headers-inbound/doc.md +41 -0
  563. package/docs/policies/set-headers-inbound/intro.md +2 -0
  564. package/docs/policies/set-headers-inbound/schema.json +83 -0
  565. package/docs/policies/set-headers-outbound/schema.json +83 -0
  566. package/docs/policies/set-query-params-inbound/schema.json +83 -0
  567. package/docs/policies/set-status-outbound/schema.json +62 -0
  568. package/docs/policies/sleep-inbound/schema.json +56 -0
  569. package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
  570. package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
  571. package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
  572. package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
  573. package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
  574. package/docs/policies/transform-body-inbound/intro.md +8 -0
  575. package/docs/policies/transform-body-inbound/policy.ts +16 -0
  576. package/docs/policies/transform-body-inbound/schema.json +27 -0
  577. package/docs/policies/transform-body-outbound/intro.md +8 -0
  578. package/docs/policies/transform-body-outbound/policy.ts +19 -0
  579. package/docs/policies/transform-body-outbound/schema.json +27 -0
  580. package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
  581. package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
  582. package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
  583. package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
  584. package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
  585. package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
  586. package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
  587. package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
  588. package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
  589. package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
  590. package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
  591. package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
  592. package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
  593. package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
  594. package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
  595. package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
  596. package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
  597. package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
  598. package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
  599. package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
  600. package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
  601. package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
  602. package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
  603. package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
  604. package/docs/policies/xml-to-json-outbound/doc.md +71 -0
  605. package/docs/policies/xml-to-json-outbound/intro.md +4 -0
  606. package/docs/policies/xml-to-json-outbound/schema.json +117 -0
  607. package/docs/programmable-api/audit-log.mdx +74 -0
  608. package/docs/programmable-api/background-dispatcher.mdx +124 -0
  609. package/docs/programmable-api/background-loader.mdx +104 -0
  610. package/docs/programmable-api/cache.mdx +186 -0
  611. package/docs/programmable-api/compatibility-dates.mdx +201 -0
  612. package/docs/programmable-api/console-logging.mdx +48 -0
  613. package/docs/programmable-api/context-data.mdx +127 -0
  614. package/docs/programmable-api/custom-cors-policy.mdx +64 -0
  615. package/docs/programmable-api/environment.mdx +328 -0
  616. package/docs/programmable-api/hooks.mdx +569 -0
  617. package/docs/programmable-api/http-problems.mdx +385 -0
  618. package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
  619. package/docs/programmable-api/logger.mdx +223 -0
  620. package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
  621. package/docs/programmable-api/node-modules.mdx +67 -0
  622. package/docs/programmable-api/not-found-handler.mdx +47 -0
  623. package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
  624. package/docs/programmable-api/overview.mdx +213 -0
  625. package/docs/programmable-api/problem-response-formatter.mdx +183 -0
  626. package/docs/programmable-api/request-user.mdx +289 -0
  627. package/docs/programmable-api/reusing-code.mdx +26 -0
  628. package/docs/programmable-api/route-raw.mdx +55 -0
  629. package/docs/programmable-api/runtime-behaviors.mdx +25 -0
  630. package/docs/programmable-api/runtime-errors.mdx +246 -0
  631. package/docs/programmable-api/runtime-extensions.mdx +340 -0
  632. package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
  633. package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
  634. package/docs/programmable-api/web-crypto-apis.mdx +219 -0
  635. package/docs/programmable-api/web-standard-apis.mdx +109 -0
  636. package/docs/programmable-api/zone-cache.mdx +131 -0
  637. package/docs/programmable-api/zp-body-removed.mdx +32 -0
  638. package/docs/programmable-api/zuplo-context.mdx +414 -0
  639. package/docs/programmable-api/zuplo-id-token.mdx +90 -0
  640. package/docs/programmable-api/zuplo-json.mdx +91 -0
  641. package/docs/programmable-api/zuplo-request.mdx +200 -0
  642. package/docs/sample-apis.mdx +78 -0
  643. package/docs/self-hosted/overview.md +60 -0
  644. 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.