zuplo 6.72.7 → 6.72.8

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 (74) hide show
  1. package/docs/articles/ddos-protection.mdx +2 -2
  2. package/docs/articles/limits.mdx +12 -0
  3. package/docs/articles/local-development-troubleshooting.mdx +12 -3
  4. package/docs/articles/waf-ddos.mdx +1 -24
  5. package/docs/policies/akamai-ai-firewall/schema.json +1 -0
  6. package/docs/policies/akamai-firewall-for-ai-inbound/schema.json +2 -0
  7. package/docs/policies/akamai-firewall-for-ai-outbound/schema.json +2 -0
  8. package/docs/policies/amberflo-metering-inbound/schema.json +5 -2
  9. package/docs/policies/api-key-inbound/schema.json +11 -5
  10. package/docs/policies/audit-log-inbound/schema.json +2 -0
  11. package/docs/policies/auth0-jwt-auth-inbound/schema.json +7 -5
  12. package/docs/policies/authzen-inbound/schema.json +7 -5
  13. package/docs/policies/axiomatics-authz-inbound/schema.json +14 -6
  14. package/docs/policies/basic-auth-inbound/schema.json +2 -1
  15. package/docs/policies/caching-inbound/schema.json +20 -16
  16. package/docs/policies/clerk-jwt-auth-inbound/schema.json +7 -5
  17. package/docs/policies/cognito-jwt-auth-inbound/schema.json +7 -5
  18. package/docs/policies/comet-opik-tracing-inbound/schema.json +1 -0
  19. package/docs/policies/complex-rate-limit-inbound/schema.json +4 -0
  20. package/docs/policies/curity-phantom-token-inbound/schema.json +1 -0
  21. package/docs/policies/data-loss-prevention-inbound/schema.json +15 -12
  22. package/docs/policies/data-loss-prevention-outbound/schema.json +15 -12
  23. package/docs/policies/firebase-jwt-inbound/schema.json +7 -5
  24. package/docs/policies/formdata-to-json-inbound/schema.json +1 -0
  25. package/docs/policies/galileo-tracing-inbound/schema.json +1 -0
  26. package/docs/policies/geo-filter-inbound/schema.json +1 -0
  27. package/docs/policies/graphql-analytics-outbound/schema.json +1 -0
  28. package/docs/policies/mcp-auth0-oauth-inbound/schema.json +3 -0
  29. package/docs/policies/mcp-clerk-oauth-inbound/schema.json +3 -0
  30. package/docs/policies/mcp-cognito-oauth-inbound/schema.json +3 -0
  31. package/docs/policies/mcp-entra-oauth-inbound/schema.json +3 -0
  32. package/docs/policies/mcp-google-oauth-inbound/schema.json +3 -0
  33. package/docs/policies/mcp-keycloak-oauth-inbound/schema.json +3 -0
  34. package/docs/policies/mcp-logto-oauth-inbound/schema.json +3 -0
  35. package/docs/policies/mcp-oauth-inbound/schema.json +2 -0
  36. package/docs/policies/mcp-okta-oauth-inbound/schema.json +3 -0
  37. package/docs/policies/mcp-onelogin-oauth-inbound/schema.json +3 -0
  38. package/docs/policies/mcp-ping-oauth-inbound/schema.json +3 -0
  39. package/docs/policies/mcp-token-exchange-inbound/schema.json +10 -5
  40. package/docs/policies/mcp-workos-oauth-inbound/schema.json +3 -0
  41. package/docs/policies/monetization-inbound/schema.json +25 -23
  42. package/docs/policies/mtls-auth-inbound/schema.json +6 -5
  43. package/docs/policies/okta-fga-authz-inbound/schema.json +7 -6
  44. package/docs/policies/okta-jwt-auth-inbound/schema.json +7 -5
  45. package/docs/policies/open-id-jwt-auth-inbound/schema.json +11 -6
  46. package/docs/policies/openfga-authz-inbound/schema.json +7 -6
  47. package/docs/policies/openmeter-inbound/schema.json +23 -19
  48. package/docs/policies/prompt-injection-outbound/schema.json +6 -5
  49. package/docs/policies/propel-auth-jwt-inbound/schema.json +7 -5
  50. package/docs/policies/query-param-to-header-inbound/schema.json +1 -0
  51. package/docs/policies/quota-inbound/schema.json +9 -6
  52. package/docs/policies/rate-limit-inbound/schema.json +4 -0
  53. package/docs/policies/readme-metrics-inbound/schema.json +9 -5
  54. package/docs/policies/request-size-limit-inbound/schema.json +1 -0
  55. package/docs/policies/request-validation-inbound/schema.json +8 -6
  56. package/docs/policies/require-origin-inbound/schema.json +1 -0
  57. package/docs/policies/semantic-cache-inbound/schema.json +9 -5
  58. package/docs/policies/set-status-outbound/schema.json +1 -0
  59. package/docs/policies/set-upstream-api-key-inbound/schema.json +7 -5
  60. package/docs/policies/stripe-webhook-verification-inbound/schema.json +2 -1
  61. package/docs/policies/supabase-jwt-auth-inbound/schema.json +7 -5
  62. package/docs/policies/traffic-splitting-inbound/schema.json +1 -0
  63. package/docs/policies/upstream-aws-federated-auth-inbound/schema.json +6 -0
  64. package/docs/policies/upstream-aws-service-auth-inbound/schema.json +8 -0
  65. package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +3 -1
  66. package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +2 -0
  67. package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +8 -5
  68. package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +4 -0
  69. package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +5 -0
  70. package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +20 -15
  71. package/docs/policies/web-bot-auth-inbound/schema.json +2 -0
  72. package/docs/policies/xml-to-json-outbound/schema.json +9 -5
  73. package/package.json +4 -4
  74. package/docs/articles/zuplo-waf.mdx +0 -156
@@ -49,6 +49,11 @@
49
49
  "type": "string",
50
50
  "description": "The property on the incoming request.user object to retrieve the value of the userId."
51
51
  },
52
+ "webApiKey": {
53
+ "type": "string",
54
+ "examples": ["$env(WEB_API_KEY)"],
55
+ "description": "The Firebase Web API Key (found in project settings)"
56
+ },
52
57
  "developerClaims": {
53
58
  "type": "object",
54
59
  "tsType": "Record<string, string | number | boolean | null>",
@@ -73,21 +78,19 @@
73
78
  "premium": true
74
79
  }
75
80
  ],
81
+ "x-advanced": true,
76
82
  "description": "Additional claims to include in the custom token's payload."
77
83
  },
78
- "webApiKey": {
79
- "type": "string",
80
- "examples": ["$env(WEB_API_KEY)"],
81
- "description": "The Firebase Web API Key (found in project settings)"
82
- },
83
84
  "tokenRetries": {
84
85
  "type": "number",
85
86
  "default": 3,
87
+ "x-advanced": true,
86
88
  "description": "The number of times to retry fetching the token in the event of a failure."
87
89
  },
88
90
  "expirationOffsetSeconds": {
89
91
  "type": "number",
90
92
  "default": 300,
93
+ "x-advanced": true,
91
94
  "description": "The number of seconds less than the token expiration to cache the token."
92
95
  }
93
96
  }
@@ -59,23 +59,27 @@
59
59
  "type": "number",
60
60
  "x-show-example": false,
61
61
  "default": 3600,
62
+ "x-advanced": true,
62
63
  "description": "The lifetime in seconds of the issued token."
63
64
  },
64
65
  "tokenRetries": {
65
66
  "type": "number",
66
67
  "x-show-example": false,
67
68
  "default": 3,
69
+ "x-advanced": true,
68
70
  "description": "The number of times to retry fetching the token in the event of a failure."
69
71
  },
70
72
  "expirationOffsetSeconds": {
71
73
  "type": "number",
72
74
  "x-show-example": false,
73
75
  "default": 300,
76
+ "x-advanced": true,
74
77
  "description": "The number of seconds less than the token expiration to cache the token."
75
78
  },
76
79
  "useMemoryCacheOnly": {
77
80
  "type": "boolean",
78
81
  "x-show-example": false,
82
+ "x-advanced": true,
79
83
  "description": "This is an advanced option that should only be used if you do not want to persist information in ZoneCache."
80
84
  }
81
85
  }
@@ -57,17 +57,20 @@
57
57
  "type": "number",
58
58
  "x-show-example": false,
59
59
  "default": 3,
60
+ "x-advanced": true,
60
61
  "description": "The number of times to retry fetching the token in the event of a failure."
61
62
  },
62
63
  "expirationOffsetSeconds": {
63
64
  "type": "number",
64
65
  "x-show-example": false,
65
66
  "default": 300,
67
+ "x-advanced": true,
66
68
  "description": "The number of seconds less than the token expiration to cache the token."
67
69
  },
68
70
  "useMemoryCacheOnly": {
69
71
  "type": "boolean",
70
72
  "x-show-example": false,
73
+ "x-advanced": true,
71
74
  "description": "This is an advanced option that should only be used if you do not want to persist information in ZoneCache."
72
75
  },
73
76
  "version": {
@@ -75,12 +78,14 @@
75
78
  "default": 1,
76
79
  "enum": [1, 2],
77
80
  "x-show-example": false,
81
+ "x-advanced": true,
78
82
  "description": "The version of the policy."
79
83
  },
80
84
  "enableSuspiciousHeaderWarning": {
81
85
  "type": "boolean",
82
86
  "default": true,
83
87
  "x-show-example": false,
88
+ "x-advanced": true,
84
89
  "description": "When `true` (the default), emits a warning if the inbound request carries headers like `X-Serverless-Authorization` or `X-Goog-IAP-JWT-Assertion`. Forwarding those to a downstream Cloud Run typically causes a `the access token could not be verified` 401 because Cloud Run prefers `X-Serverless-Authorization` over `Authorization` for IAM checks. Set this to `false` only if you have intentionally chosen to forward those headers (e.g. the upstream service is also IAP-fronted and expects them) — the warning is otherwise a useful diagnostic signal."
85
90
  }
86
91
  }
@@ -40,10 +40,26 @@
40
40
  "examples": ["https://api.example.com", "my-service"],
41
41
  "description": "The audience claim for the JWT."
42
42
  },
43
+ "expiresIn": {
44
+ "oneOf": [
45
+ {
46
+ "type": "number",
47
+ "description": "Expiration time in seconds."
48
+ },
49
+ {
50
+ "type": "string",
51
+ "description": "Expiration time as a string."
52
+ }
53
+ ],
54
+ "default": 300,
55
+ "examples": [300, "5m", "1h", "7d"],
56
+ "description": "JWT expiration time. Can be a number (seconds) or a string with units (e.g., '5m' for 5 minutes, '1h' for 1 hour, '7d' for 7 days). Defaults to 300 seconds (5 minutes)."
57
+ },
43
58
  "subject": {
44
59
  "type": "string",
45
60
  "examples": ["zuplo-gateway"],
46
61
  "x-show-example": false,
62
+ "x-advanced": true,
47
63
  "description": "The subject ('sub') claim for the minted JWT. Identifies the acting subject of the token (typically the gateway itself)."
48
64
  },
49
65
  "claimsFromUser": {
@@ -57,18 +73,21 @@
57
73
  }
58
74
  ],
59
75
  "x-show-example": false,
76
+ "x-advanced": true,
60
77
  "description": "Maps claims in the minted JWT to values from the authenticated user (request.user). Each key is the claim name to set; each value is a light JSON-path selector into request.user using dot or bracket notation (e.g. 'sub', 'data.role', or 'data\\[\"https://example.com/claim\"\\]' for keys containing dots or slashes). When set, the policy requires an authenticated user and returns 401 if request.user is absent — it never mints a token with missing identity."
61
78
  },
62
79
  "headerName": {
63
80
  "type": "string",
64
81
  "default": "Authorization",
65
82
  "examples": ["Authorization", "X-API-Token"],
83
+ "x-advanced": true,
66
84
  "description": "The header name where the JWT will be attached. Defaults to 'Authorization'."
67
85
  },
68
86
  "tokenPrefix": {
69
87
  "type": "string",
70
88
  "default": "Bearer",
71
89
  "examples": ["Bearer", "Token"],
90
+ "x-advanced": true,
72
91
  "description": "The prefix to use before the JWT token. Defaults to 'Bearer'. Set to an empty string to send the token without a prefix."
73
92
  },
74
93
  "additionalClaims": {
@@ -79,23 +98,9 @@
79
98
  "custom": "value"
80
99
  }
81
100
  ],
101
+ "x-advanced": true,
82
102
  "description": "Additional claims to include in the JWT. These will be merged with the default claims.",
83
103
  "additionalProperties": true
84
- },
85
- "expiresIn": {
86
- "oneOf": [
87
- {
88
- "type": "number",
89
- "description": "Expiration time in seconds."
90
- },
91
- {
92
- "type": "string",
93
- "description": "Expiration time as a string."
94
- }
95
- ],
96
- "default": 300,
97
- "examples": [300, "5m", "1h", "7d"],
98
- "description": "JWT expiration time. Can be a number (seconds) or a string with units (e.g., '5m' for 5 minutes, '1h' for 1 hour, '7d' for 7 days). Defaults to 300 seconds (5 minutes)."
99
104
  }
100
105
  }
101
106
  }
@@ -47,11 +47,13 @@
47
47
  },
48
48
  "allowUnauthenticatedRequests": {
49
49
  "type": "boolean",
50
+ "x-advanced": true,
50
51
  "description": "Allow requests without bot signatures to proceed. This is useful if you want to use multiple authentication policies or if you want to allow both authenticated and non-authenticated traffic.",
51
52
  "default": false
52
53
  },
53
54
  "directoryUrl": {
54
55
  "type": "string",
56
+ "x-advanced": true,
55
57
  "description": "Optional URL to a directory of known bots (for verification).",
56
58
  "default": null
57
59
  }
@@ -55,29 +55,32 @@
55
55
  "default": true,
56
56
  "description": "Ignore tag attributes."
57
57
  },
58
+ "trimValues": {
59
+ "type": "boolean",
60
+ "default": true,
61
+ "description": "Remove surrounding whitespace from tag or attribute value."
62
+ },
58
63
  "stopNodes": {
59
64
  "type": "array",
60
65
  "items": {
61
66
  "type": "string"
62
67
  },
63
68
  "examples": [["root.a", "*.accounts"]],
69
+ "x-advanced": true,
64
70
  "description": "At particular point, if you don't want to parse a tag and it's nested tags then you can set their path in stopNodes. You can also set tags which should not be processed irrespective of their path using \\* as the wildcard."
65
71
  },
66
72
  "attributeNamePrefix": {
67
73
  "type": "string",
68
74
  "default": "@_",
75
+ "x-advanced": true,
69
76
  "description": "The prefix of attribute names in the resulting JS object."
70
77
  },
71
78
  "textNodeName": {
72
79
  "type": "string",
73
80
  "default": "#text",
81
+ "x-advanced": true,
74
82
  "description": "Text value of a tag is parsed to \\#text property by default."
75
83
  },
76
- "trimValues": {
77
- "type": "boolean",
78
- "default": true,
79
- "description": "Remove surrounding whitespace from tag or attribute value."
80
- },
81
84
  "parseOnStatusCodes": {
82
85
  "oneOf": [
83
86
  {
@@ -90,6 +93,7 @@
90
93
  }
91
94
  }
92
95
  ],
96
+ "x-advanced": true,
93
97
  "description": "A list of status codes and ranges \"200-299, 304\" that should the XML parser should run on. If not set, the parser will run on all status codes.",
94
98
  "examples": ["200-299"]
95
99
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zuplo",
3
- "version": "6.72.7",
3
+ "version": "6.72.8",
4
4
  "type": "module",
5
5
  "description": "The programmable API Gateway",
6
6
  "author": "Zuplo, Inc.",
@@ -19,9 +19,9 @@
19
19
  "zuplo": "zuplo.js"
20
20
  },
21
21
  "dependencies": {
22
- "@zuplo/cli": "6.72.7",
23
- "@zuplo/core": "6.72.7",
24
- "@zuplo/runtime": "6.72.7",
22
+ "@zuplo/cli": "6.72.8",
23
+ "@zuplo/core": "6.72.8",
24
+ "@zuplo/runtime": "6.72.8",
25
25
  "@zuplo/test": "1.4.0"
26
26
  }
27
27
  }
@@ -1,156 +0,0 @@
1
- ---
2
- title: Zuplo Managed WAF
3
- ---
4
-
5
- Zuplo's Managed WAF provides enterprise customers using our **managed edge
6
- deployment** with comprehensive security protection purpose-built for API
7
- Gateways. This service offers multiple layers of protection against common
8
- threats, attacks, and malicious traffic without requiring you to manage complex
9
- security configurations.
10
-
11
- <EnterpriseFeature name="Zuplo Managed WAF" />
12
-
13
- :::note
14
-
15
- Zuplo Managed WAF is only available for customers using Zuplo's managed edge
16
- deployment model. Customers using managed dedicated deployments should refer to
17
- the [Managed Dedicated WAF Options](#managed-dedicated-waf-options) section
18
- below.
19
-
20
- :::
21
-
22
- ## Available Protection Rules
23
-
24
- ### OWASP Core Ruleset
25
-
26
- Zuplo's Managed WAF includes protection based on the
27
- [OWASP Core Ruleset](https://owasp.org/www-project-top-ten/), which defends
28
- against the most critical web application security risks. This includes
29
- protection against:
30
-
31
- - **SQL Injection** - Prevents attackers from inserting malicious SQL code
32
- - **Cross-Site Scripting (XSS)** - Blocks malicious scripts from being injected
33
- into your API responses
34
- - **Remote Code Execution** - Prevents attackers from executing arbitrary code
35
- - **Local File Inclusion** - Blocks attempts to access local server files
36
- - **Remote File Inclusion** - Prevents loading of remote malicious files
37
- - **PHP Code Injection** - Blocks malicious PHP code execution attempts
38
- - **HTTP Protocol Violations** - Detects and blocks malformed HTTP requests
39
- - **Session Fixation** - Prevents session hijacking attempts
40
- - **Scanner Detection** - Identifies and blocks automated vulnerability scanners
41
- - **Metadata/Error Leakages** - Prevents exposure of sensitive system
42
- information
43
-
44
- ### OFAC Sanctioned Country Blocking
45
-
46
- Zuplo's Managed WAF includes automatic blocking of traffic from countries on the
47
- [OFAC Sanctions Programs list](https://ofac.treasury.gov/sanctions-programs-and-country-information).
48
- This helps ensure compliance with U.S. Treasury regulations by preventing API
49
- access from sanctioned regions.
50
-
51
- The blocked country list is automatically updated as OFAC sanctions change,
52
- ensuring your API remains compliant without manual intervention.
53
-
54
- ### DDoS Protection
55
-
56
- All Zuplo API Gateways include automatic DDoS protection that defends against:
57
-
58
- - **Layer 3/4 Attacks** - Network and transport layer flood attacks
59
- - **Layer 7 Attacks** - Application layer attacks targeting your API endpoints
60
- - **Amplification Attacks** - DNS, NTP, and other amplification-based attacks
61
- - **SYN Floods** - TCP connection exhaustion attempts
62
- - **HTTP Floods** - High-volume HTTP request attacks
63
-
64
- DDoS protection is always-on and automatically scales to handle attacks of any
65
- size without impacting legitimate traffic.
66
-
67
- ### Zero-Day Vulnerability Protection
68
-
69
- Zuplo's Managed WAF includes rapid response protection against emerging threats
70
- and zero-day vulnerabilities. When critical vulnerabilities are discovered,
71
- protection rules are automatically deployed across all protected gateways
72
- without requiring any action from your team.
73
-
74
- ## Custom WAF Rules
75
-
76
- Enterprise customers can work with Zuplo to create and enable custom WAF rules
77
- tailored to their specific security requirements. Custom rules can be configured
78
- to:
79
-
80
- - Block or allow traffic based on specific patterns
81
- - Create IP allowlists or blocklists
82
- - Implement rate limiting for specific endpoints
83
- - Add custom request validation
84
- - Create geography-based access controls beyond OFAC requirements
85
- - Implement custom bot detection and mitigation
86
-
87
- To discuss custom WAF rule requirements, contact your Zuplo account team.
88
-
89
- ## Enabling Zuplo Managed WAF
90
-
91
- Zuplo's Managed WAF is available to enterprise customers. The service can be
92
- enabled with different protection levels based on your security requirements:
93
-
94
- - **Standard Protection** - OWASP Core Rules and DDoS protection
95
- - **Enhanced Protection** - Includes OFAC blocking and zero-day protection
96
- - **Custom Protection** - All features plus custom rules tailored to your needs
97
-
98
- To enable Zuplo's Managed WAF on your API Gateway, contact our
99
- [sales team](mailto:sales@zuplo.com).
100
-
101
- ## Benefits
102
-
103
- - **Edge-deployed protection** - Security rules run at the same edge locations
104
- as your API, ensuring no additional latency
105
- - **Automatic updates** - Protection rules are continuously updated without
106
- requiring deployments
107
- - **No configuration complexity** - Pre-configured rulesets based on security
108
- best practices
109
- - **Compliance support** - Automatic OFAC sanctions compliance
110
- - **24/7 protection** - Always-on security monitoring and threat mitigation
111
-
112
- ## Complementary Zuplo Policies
113
-
114
- In addition to Zuplo Managed WAF, you can implement many security features
115
- directly using Zuplo's built-in policies:
116
-
117
- - **IP Restriction** - Block or allow specific IP addresses with the
118
- [IP Restriction policy](../policies/ip-restriction-inbound)
119
- - **Geolocation Controls** - Route or block requests based on geographic
120
- location using [custom policies](../guides/geolocation-backend-routing)
121
- - **Rate Limiting** - Implement granular rate limits with
122
- [rate limiting policies](../policies/rate-limit-inbound)
123
- - **Custom Security Rules** - Create any custom security logic with
124
- [custom code policies](../policies/custom-code-inbound)
125
-
126
- These policies can be used alongside Zuplo Managed WAF for defense-in-depth
127
- security or independently for specific security requirements.
128
-
129
- ## Managed Dedicated WAF Options
130
-
131
- For customers using Zuplo's managed dedicated deployment model, WAF and DDoS
132
- protection options depend on your chosen cloud provider. Unlike the standardized
133
- Zuplo Managed WAF available for edge deployments, managed dedicated customers
134
- can leverage the full range of security services offered by their cloud
135
- platform.
136
-
137
- For managed dedicated deployments, our team will:
138
-
139
- 1. Assess your security requirements during the deployment planning phase
140
- 2. Configure the appropriate WAF and DDoS services based on your cloud provider
141
- 3. Implement custom rules and policies specific to your use case
142
- 4. Provide ongoing support for security configuration updates
143
-
144
- Contact our [sales team](mailto:sales@zuplo.com) to discuss security options for
145
- your managed dedicated deployment.
146
-
147
- ## Next Steps
148
-
149
- If you're interested in Zuplo's Managed WAF services for edge deployments or
150
- need custom security configurations for managed dedicated deployments, contact
151
- our [sales team](mailto:sales@zuplo.com) to discuss your requirements.
152
-
153
- For customers requiring full control over WAF configurations, see our guides for
154
- integrating with [Cloudflare WAF](./waf-ddos.mdx#cloudflare-waf--ddos),
155
- [Fastly Next-Gen WAF](./waf-ddos-fastly.mdx), or
156
- [AWS WAF + Shield](./waf-ddos-aws-waf-shield.mdx).