zuplo 6.70.71 → 6.71.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/docs/analytics/access-and-entitlements.md +1 -1
- package/docs/analytics/overview.md +12 -8
- package/docs/analytics/reference/metrics-glossary.md +3 -3
- package/docs/analytics/shared-controls.md +12 -11
- package/docs/analytics/tabs/agents.md +14 -14
- package/docs/analytics/tabs/consumers.md +6 -6
- package/docs/analytics/tabs/graphql.md +5 -4
- package/docs/analytics/tabs/mcp.md +7 -7
- package/docs/analytics/tabs/origins.md +11 -10
- package/docs/analytics/tabs/requests.md +6 -5
- package/docs/articles/accounts/enterprise-sso.mdx +8 -6
- package/docs/articles/api-key-administration.mdx +4 -0
- package/docs/articles/bypass-policy-for-testing.mdx +4 -0
- package/docs/articles/environment-variables.mdx +5 -1
- package/docs/articles/environments.mdx +2 -2
- package/docs/articles/graphql.mdx +23 -39
- package/docs/articles/mcp-quickstart-local.mdx +2 -1
- package/docs/articles/mcp-quickstart.mdx +6 -1
- package/docs/articles/multiple-auth-policies.mdx +2 -2
- package/docs/articles/openapi.mdx +6 -1
- package/docs/articles/rename-or-move-project.mdx +4 -0
- package/docs/articles/securing-your-backend.mdx +11 -3
- package/docs/articles/source-control-setup-github.mdx +4 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +2 -2
- package/docs/articles/troubleshooting.md +3 -3
- package/docs/dedicated/akamai/architecture.mdx +9 -9
- package/docs/dev-portal/zudoku/components/browser-window.mdx +94 -0
- package/docs/dev-portal/zudoku/components/landing-page.mdx +283 -0
- package/docs/handlers/system-handlers.mdx +2 -1
- package/docs/mcp-gateway/how-to/connect-upstream-api-key.mdx +2 -2
- package/docs/mcp-gateway/observability/analytics.mdx +17 -13
- package/docs/mcp-gateway/quickstart.mdx +4 -3
- package/docs/mcp-gateway/troubleshooting.mdx +4 -4
- package/docs/policies/_index.md +1 -0
- package/docs/policies/data-loss-prevention-inbound/doc.md +23 -24
- package/docs/policies/data-loss-prevention-inbound/intro.md +9 -9
- package/docs/policies/data-loss-prevention-outbound/doc.md +25 -26
- package/docs/policies/data-loss-prevention-outbound/intro.md +10 -10
- package/docs/policies/graphql-analytics-outbound/doc.md +93 -0
- package/docs/policies/graphql-analytics-outbound/intro.md +12 -0
- package/docs/policies/graphql-analytics-outbound/schema.json +93 -0
- package/docs/programmable-api/zuplo-context.mdx +3 -2
- package/package.json +4 -4
|
@@ -62,7 +62,7 @@ Remove the `demo` parameter from the URL to return to your real data.
|
|
|
62
62
|
## Scope: account vs project
|
|
63
63
|
|
|
64
64
|
- **Account scope** aggregates across every project in the account. The Requests
|
|
65
|
-
|
|
65
|
+
section adds **Project Name** and **Deployment Name** as breakdowns; click a
|
|
66
66
|
project name to drill into project scope.
|
|
67
67
|
- **Project scope** filters to a single project and adds an **Environment**
|
|
68
68
|
selector (Working Copy, Production, Preview, Other) in the top bar.
|
|
@@ -19,12 +19,15 @@ you're answering "is anyone actually using this endpoint?"
|
|
|
19
19
|
|
|
20
20
|
## How to access
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Analytics lives in the **Observability** tab of the Zuplo Portal, alongside
|
|
23
|
+
**Logs** and **Traces**. The page works at two scopes:
|
|
23
24
|
|
|
24
25
|
- **Account scope**: aggregates across every project in your account. Open
|
|
25
|
-
[
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
[**Observability → Analytics**](https://portal.zuplo.com/+/account/observability/analytics)
|
|
27
|
+
at the account level.
|
|
28
|
+
- **Project scope**: open a project, click **Observability**, then select
|
|
29
|
+
**Analytics**. This view filters to one project and adds an **Environment**
|
|
30
|
+
selector.
|
|
28
31
|
|
|
29
32
|
## What's in this section
|
|
30
33
|
|
|
@@ -32,7 +35,7 @@ Open **Analytics** in the Zuplo portal sidebar. The page works at two scopes:
|
|
|
32
35
|
demo mode, retention.
|
|
33
36
|
- [Shared controls](./shared-controls.md): time range, filters, environment
|
|
34
37
|
selector, banners, URL state.
|
|
35
|
-
-
|
|
38
|
+
- Sections:
|
|
36
39
|
- [Requests](./tabs/requests.md): overall traffic, latency, errors.
|
|
37
40
|
- [Origins](./tabs/origins.md): backend performance.
|
|
38
41
|
- [Consumers](./tabs/consumers.md): per-consumer breakdowns.
|
|
@@ -46,11 +49,12 @@ Open **Analytics** in the Zuplo portal sidebar. The page works at two scopes:
|
|
|
46
49
|
percentile defined once.
|
|
47
50
|
- [URL parameters](./reference/url-parameters.md): permalink reference.
|
|
48
51
|
|
|
49
|
-
##
|
|
52
|
+
## Section visibility
|
|
50
53
|
|
|
51
|
-
|
|
54
|
+
Analytics is split into sections, listed in a sidebar on the left of the page.
|
|
55
|
+
You'll see a subset of sections depending on your plan and project setup:
|
|
52
56
|
|
|
53
|
-
|
|
|
57
|
+
| Section | When it appears |
|
|
54
58
|
| --------- | ---------------------------------------------------------- |
|
|
55
59
|
| Requests | All accounts with advanced analytics enabled. |
|
|
56
60
|
| Origins | The project uses managed-edge origins. |
|
|
@@ -4,7 +4,7 @@ sidebar_label: "Metrics Glossary"
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
This page defines every term used in the Analytics dashboards once. KPI tables
|
|
7
|
-
on
|
|
7
|
+
on section pages link here for depth.
|
|
8
8
|
|
|
9
9
|
## HTTP status classes
|
|
10
10
|
|
|
@@ -43,7 +43,7 @@ longer. P95 is the standard tail-latency metric.
|
|
|
43
43
|
outlier behavior that P95 may smooth over.
|
|
44
44
|
|
|
45
45
|
**Latency distribution histogram.** Bands at P10, P50, P90, P95, P99. Clicking a
|
|
46
|
-
band
|
|
46
|
+
band in the Requests section filters to requests in that duration range.
|
|
47
47
|
|
|
48
48
|
## Active edge instances
|
|
49
49
|
|
|
@@ -81,7 +81,7 @@ MCP events use these outcome classes:
|
|
|
81
81
|
|
|
82
82
|
## GraphQL error classes
|
|
83
83
|
|
|
84
|
-
The GraphQL
|
|
84
|
+
The GraphQL section groups errors by where they arise:
|
|
85
85
|
|
|
86
86
|
| Class | Meaning |
|
|
87
87
|
| ---------- | ---------------------------------------------------------------- |
|
|
@@ -3,19 +3,20 @@ title: "Shared Controls"
|
|
|
3
3
|
sidebar_label: "Shared Controls"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Every Analytics
|
|
7
|
-
range picker, a filter bar, and (at project scope) an environment selector.
|
|
6
|
+
Every Analytics section uses the same set of controls at the top of the page: a
|
|
7
|
+
time range picker, a filter bar, and (at project scope) an environment selector.
|
|
8
8
|
State persists to the URL so you can share or bookmark any view.
|
|
9
9
|
|
|
10
10
|
## When to use this
|
|
11
11
|
|
|
12
|
-
- Narrow a
|
|
12
|
+
- Narrow a section to a time window, environment, or set of filter values.
|
|
13
13
|
- Build a shareable link to a specific view.
|
|
14
14
|
- Understand what each banner across the top of the page means.
|
|
15
15
|
|
|
16
16
|
## Time range
|
|
17
17
|
|
|
18
|
-
The time range picker controls every chart, table, and KPI
|
|
18
|
+
The time range picker controls every chart, table, and KPI in the active
|
|
19
|
+
section.
|
|
19
20
|
|
|
20
21
|
**Presets.** Last 1h, 6h, 24h, 3d, 7d, 14d, 28d, 60d, 90d.
|
|
21
22
|
|
|
@@ -28,7 +29,7 @@ for [preset]** tooltip. See
|
|
|
28
29
|
|
|
29
30
|
## Filters
|
|
30
31
|
|
|
31
|
-
Filters render as removable pills in a sticky bar at the top of the
|
|
32
|
+
Filters render as removable pills in a sticky bar at the top of the page. Add a
|
|
32
33
|
filter from any breakdown table by clicking a value, or build one manually.
|
|
33
34
|
|
|
34
35
|
**Match modes.** Each filter uses one of:
|
|
@@ -46,9 +47,9 @@ filter from any breakdown table by clicking a value, or build one manually.
|
|
|
46
47
|
**Clearing.** Remove a single pill with its **×**, or click **Clear all
|
|
47
48
|
filters** to reset.
|
|
48
49
|
|
|
49
|
-
**Disabled fields.** Some fields are grayed out
|
|
50
|
-
For example, `originHost` is unavailable on Requests, Consumers, and
|
|
51
|
-
`userSub` is unavailable on Origins.
|
|
50
|
+
**Disabled fields.** Some fields are grayed out in sections where they don't
|
|
51
|
+
apply. For example, `originHost` is unavailable on Requests, Consumers, and
|
|
52
|
+
Agents; `userSub` is unavailable on Origins.
|
|
52
53
|
|
|
53
54
|
## Environment selector
|
|
54
55
|
|
|
@@ -103,9 +104,9 @@ Banners appear at the top of the page in this priority order:
|
|
|
103
104
|
|
|
104
105
|
## Loading and empty states
|
|
105
106
|
|
|
106
|
-
Each
|
|
107
|
-
product analytics
|
|
108
|
-
flashing when data is already cached. Empty states
|
|
107
|
+
Each section uses a shape-aware skeleton while the first request is in flight.
|
|
108
|
+
The product analytics sections (MCP, GraphQL) suppress that skeleton briefly to
|
|
109
|
+
avoid flashing when data is already cached. Empty states there include a short
|
|
109
110
|
description and a "Read the … docs" link to the relevant product section.
|
|
110
111
|
|
|
111
112
|
## Status colors
|
|
@@ -3,9 +3,9 @@ title: "Agents"
|
|
|
3
3
|
sidebar_label: "Agents"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **Agents**
|
|
7
|
-
ChatGPT, Claude.ai, Cursor, GPTBot, and similar clients. It's a focused
|
|
8
|
-
browsers, webhooks, and generic SDK callers are excluded.
|
|
6
|
+
The **Agents** section isolates AI agent traffic: requests classified as coming
|
|
7
|
+
from ChatGPT, Claude.ai, Cursor, GPTBot, and similar clients. It's a focused
|
|
8
|
+
view; browsers, webhooks, and generic SDK callers are excluded.
|
|
9
9
|
|
|
10
10
|
## When to use this
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ browsers, webhooks, and generic SDK callers are excluded.
|
|
|
27
27
|
## Charts
|
|
28
28
|
|
|
29
29
|
**Request Volume.** Stacked bars by status class. Granularity is always hourly
|
|
30
|
-
|
|
30
|
+
in this section.
|
|
31
31
|
|
|
32
32
|
**Agent Error Rates.** 4xx and 5xx over time. _What to look for:_ divergence
|
|
33
33
|
between agents is the headline signal. If Cursor shows a 12% 4xx rate while
|
|
@@ -48,7 +48,7 @@ your endpoint.
|
|
|
48
48
|
| 4xx sparkline | Inline trend over the window. |
|
|
49
49
|
| 5xx sparkline | Inline trend over the window. |
|
|
50
50
|
|
|
51
|
-
Searchable and sortable on any column. Click a row to filter the
|
|
51
|
+
Searchable and sortable on any column. Click a row to filter the section to that
|
|
52
52
|
agent. **Show more** loads the next 50.
|
|
53
53
|
|
|
54
54
|
## Classified agents
|
|
@@ -57,12 +57,12 @@ The classifier currently recognizes: ChatGPT, Claude.ai, Cursor, Claude Code,
|
|
|
57
57
|
GPTBot, Perplexity, Cline, Continue, OpenAI SDK, Anthropic SDK, Google AI,
|
|
58
58
|
Common Crawl. The list expands over time.
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
The Agents section excludes unclassified traffic.
|
|
61
61
|
|
|
62
62
|
:::warning
|
|
63
63
|
|
|
64
|
-
Agent charts use a dedicated hourly rollup. Filtering other
|
|
65
|
-
supported. Use the Agents
|
|
64
|
+
Agent charts use a dedicated hourly rollup. Filtering other sections by agent
|
|
65
|
+
isn't supported. Use the Agents section to drill into an individual agent.
|
|
66
66
|
|
|
67
67
|
:::
|
|
68
68
|
|
|
@@ -73,10 +73,10 @@ The filter bar applies. `originHost` is not applicable here. See
|
|
|
73
73
|
|
|
74
74
|
## Troubleshooting
|
|
75
75
|
|
|
76
|
-
**The Agents
|
|
77
|
-
the window, or your retention window doesn't yet include any agent traffic.
|
|
78
|
-
the demo with **View demo →** in the trial banner to see what a populated
|
|
79
|
-
looks like. See [Access and entitlements](../access-and-entitlements.md).
|
|
76
|
+
**The Agents section is empty.** Either no classified agents called your gateway
|
|
77
|
+
in the window, or your retention window doesn't yet include any agent traffic.
|
|
78
|
+
Try the demo with **View demo →** in the trial banner to see what a populated
|
|
79
|
+
view looks like. See [Access and entitlements](../access-and-entitlements.md).
|
|
80
80
|
|
|
81
81
|
**I see a known agent in my logs but not here.** The classifier is conservative;
|
|
82
82
|
it labels traffic that clearly matches a known agent fingerprint. Generic SDK
|
|
@@ -84,5 +84,5 @@ traffic that doesn't identify itself is excluded. If you believe an agent should
|
|
|
84
84
|
be classified, send the User-Agent string to your Zuplo contact.
|
|
85
85
|
|
|
86
86
|
**An agent shows zero requests but appears in the table.** Filters on the rest
|
|
87
|
-
of the
|
|
88
|
-
verify.
|
|
87
|
+
of the section may be excluding its traffic for the current window. Clear
|
|
88
|
+
filters to verify.
|
|
@@ -3,10 +3,10 @@ title: "Consumers"
|
|
|
3
3
|
sidebar_label: "Consumers"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **Consumers**
|
|
7
|
-
gateway, whether authenticated or anonymous. Use it to see who your
|
|
8
|
-
callers are, who's hitting errors, and which consumers experience the
|
|
9
|
-
latency.
|
|
6
|
+
The **Consumers** section breaks traffic down by API consumer: anyone calling
|
|
7
|
+
your gateway, whether authenticated or anonymous. Use it to see who your
|
|
8
|
+
noisiest callers are, who's hitting errors, and which consumers experience the
|
|
9
|
+
slowest latency.
|
|
10
10
|
|
|
11
11
|
## When to use this
|
|
12
12
|
|
|
@@ -48,12 +48,12 @@ looking at one consumer or all of them.
|
|
|
48
48
|
| 5xx sparkline | Inline trend over the window. |
|
|
49
49
|
|
|
50
50
|
The table is searchable and sortable on any column (default: requests
|
|
51
|
-
descending). Clicking a row filters the entire
|
|
51
|
+
descending). Clicking a row filters the entire section to that consumer. **Show
|
|
52
52
|
more** loads the next 50.
|
|
53
53
|
|
|
54
54
|
## Filters
|
|
55
55
|
|
|
56
|
-
The filter bar applies. `originHost`
|
|
56
|
+
The filter bar applies. `originHost` doesn't apply in this section. See
|
|
57
57
|
[Shared controls](../shared-controls.md#filters).
|
|
58
58
|
|
|
59
59
|
## Troubleshooting
|
|
@@ -3,7 +3,7 @@ title: "GraphQL"
|
|
|
3
3
|
sidebar_label: "GraphQL"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **GraphQL**
|
|
6
|
+
The **GraphQL** section breaks traffic down by GraphQL operation: the queries,
|
|
7
7
|
mutations, and subscriptions clients send through routes you've marked as
|
|
8
8
|
GraphQL endpoints. Use it to find your most-used operations, separate validation
|
|
9
9
|
and resolver errors, and see how much of each operation's latency falls in your
|
|
@@ -64,13 +64,14 @@ The filter bar applies. See [Shared controls](../shared-controls.md#filters).
|
|
|
64
64
|
|
|
65
65
|
## Troubleshooting
|
|
66
66
|
|
|
67
|
-
**The GraphQL
|
|
67
|
+
**The GraphQL section is empty.** No GraphQL operations arrived in the selected
|
|
68
68
|
window. Operations appear once a client sends a query, mutation, or subscription
|
|
69
69
|
through a route you've marked as a GraphQL endpoint. See
|
|
70
70
|
[GraphQL on Zuplo](../../articles/graphql.mdx) for how to mark a route.
|
|
71
71
|
|
|
72
|
-
**The
|
|
73
|
-
as a GraphQL endpoint. See
|
|
72
|
+
**The section isn't visible.** Visibility requires at least one route you've
|
|
73
|
+
marked as a GraphQL endpoint. See
|
|
74
|
+
[GraphQL on Zuplo](../../articles/graphql.mdx).
|
|
74
75
|
|
|
75
76
|
**Total latency is high but resolver latency is low.** The operation spends its
|
|
76
77
|
time outside your resolvers. Check the gateway policies on the GraphQL route —
|
|
@@ -3,8 +3,8 @@ title: "MCP"
|
|
|
3
3
|
sidebar_label: "MCP"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **MCP**
|
|
7
|
-
auth decisions, virtual-server routing, capability and tool invocations,
|
|
6
|
+
The **MCP** section shows Model Context Protocol traffic through Zuplo: OAuth
|
|
7
|
+
and auth decisions, virtual-server routing, capability and tool invocations,
|
|
8
8
|
JSON-RPC method usage, and upstream MCP server health. It covers both traffic
|
|
9
9
|
that flows _to_ an MCP fleet through Zuplo's gateway and activity _inside_ MCP
|
|
10
10
|
servers you host on Zuplo. It's visible when the project type is **standard**
|
|
@@ -68,12 +68,12 @@ The filter bar applies. See [Shared controls](../shared-controls.md#filters).
|
|
|
68
68
|
|
|
69
69
|
## Troubleshooting
|
|
70
70
|
|
|
71
|
-
**The MCP
|
|
72
|
-
client connects and invokes a capability or tool, the dashboard populates.
|
|
71
|
+
**The MCP section is empty.** No MCP events arrived in the selected window. Once
|
|
72
|
+
a client connects and invokes a capability or tool, the dashboard populates.
|
|
73
73
|
|
|
74
|
-
**The
|
|
75
|
-
MCP in use — either an MCP gateway that routes to upstream servers, or an
|
|
76
|
-
server you host on Zuplo.
|
|
74
|
+
**The section isn't visible.** Visibility requires project type **standard**
|
|
75
|
+
with MCP in use — either an MCP gateway that routes to upstream servers, or an
|
|
76
|
+
MCP server you host on Zuplo.
|
|
77
77
|
|
|
78
78
|
**Errors show but Failure Origins is empty.** Zuplo classifies failure origins
|
|
79
79
|
server-side from event metadata. Events without a clear origin classification
|
|
@@ -3,9 +3,9 @@ title: "Origins"
|
|
|
3
3
|
sidebar_label: "Origins"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **Origins**
|
|
7
|
-
to is performing in terms of volume, error rate, and latency. It's visible
|
|
8
|
-
the project uses managed-edge origins.
|
|
6
|
+
The **Origins** section shows backend performance: how each upstream host you
|
|
7
|
+
proxy to is performing in terms of volume, error rate, and latency. It's visible
|
|
8
|
+
when the project uses managed-edge origins.
|
|
9
9
|
|
|
10
10
|
## When to use this
|
|
11
11
|
|
|
@@ -65,18 +65,19 @@ The table is hidden when no tunnel traffic is present.
|
|
|
65
65
|
|
|
66
66
|
## Filters
|
|
67
67
|
|
|
68
|
-
The filter bar applies, with one exception: `userSub`
|
|
69
|
-
|
|
68
|
+
The filter bar applies, with one exception: `userSub` doesn't apply in this
|
|
69
|
+
section. See [Shared controls](../shared-controls.md#filters).
|
|
70
70
|
|
|
71
71
|
## Troubleshooting
|
|
72
72
|
|
|
73
|
-
**The Origins
|
|
74
|
-
managed-edge origins. If your project routes traffic differently, the
|
|
73
|
+
**The Origins section isn't visible.** It appears only when the project uses
|
|
74
|
+
managed-edge origins. If your project routes traffic differently, the section is
|
|
75
75
|
hidden.
|
|
76
76
|
|
|
77
77
|
**Service Tunnels table is missing.** That table only renders when at least one
|
|
78
78
|
origin is reached over a service tunnel.
|
|
79
79
|
|
|
80
|
-
**A 5xx spike on one origin doesn't match the Requests
|
|
81
|
-
the Requests
|
|
82
|
-
filters or
|
|
80
|
+
**A 5xx spike on one origin doesn't match the Requests section.** If you've
|
|
81
|
+
filtered the Requests section to a different route or status class, totals won't
|
|
82
|
+
match. Clear filters or apply the same filters in both sections before
|
|
83
|
+
comparing.
|
|
@@ -3,9 +3,9 @@ title: "Requests"
|
|
|
3
3
|
sidebar_label: "Requests"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The **Requests**
|
|
7
|
-
your gateway in the selected time window, with charts and breakdowns for
|
|
8
|
-
latency, and errors.
|
|
6
|
+
The **Requests** section is the default Analytics overview: every request
|
|
7
|
+
through your gateway in the selected time window, with charts and breakdowns for
|
|
8
|
+
volume, latency, and errors.
|
|
9
9
|
|
|
10
10
|
## When to use this
|
|
11
11
|
|
|
@@ -44,7 +44,8 @@ subset of requests.
|
|
|
44
44
|
**Error Rate.** 4xx and 5xx rates plotted over time.
|
|
45
45
|
|
|
46
46
|
**Latency Distribution.** A histogram of P10, P50, P90, P95, and P99 buckets.
|
|
47
|
-
Click a band to filter the rest of the
|
|
47
|
+
Click a band to filter the rest of the section to requests in that duration
|
|
48
|
+
range.
|
|
48
49
|
|
|
49
50
|
**Active Instances.** Distinct active edge instances over time. A rough
|
|
50
51
|
indicator of how widely your traffic is distributed across gateway workers.
|
|
@@ -76,7 +77,7 @@ Clicking any value applies an `equals` filter for that field.
|
|
|
76
77
|
|
|
77
78
|
## Filters
|
|
78
79
|
|
|
79
|
-
The full filter bar applies. `originHost`
|
|
80
|
+
The full filter bar applies. `originHost` doesn't apply in this section. See
|
|
80
81
|
[Shared controls](../shared-controls.md#filters) for match modes and the filter
|
|
81
82
|
pill UI.
|
|
82
83
|
|
|
@@ -8,8 +8,9 @@ using a third-party identity provider.
|
|
|
8
8
|
|
|
9
9
|
<EnterpriseFeature name="Single Sign On" />
|
|
10
10
|
|
|
11
|
-
Zuplo uses Auth0 to manage enterprise SSO, so
|
|
12
|
-
|
|
11
|
+
Zuplo uses Auth0 to manage enterprise SSO, so it can support essentially any
|
|
12
|
+
identity provider. Common options are Microsoft Entra ID, Okta, Google
|
|
13
|
+
Workspace, etc.
|
|
13
14
|
|
|
14
15
|
## Configuring your Identity Provider
|
|
15
16
|
|
|
@@ -85,14 +86,15 @@ role-based access control isn't enabled, new users will be added as an Admin.
|
|
|
85
86
|
|
|
86
87
|
### What SSO Providers does Zuplo Support?
|
|
87
88
|
|
|
88
|
-
Zuplo uses Auth0 to manage enterprise SSO, so
|
|
89
|
-
provider required. Common options are
|
|
89
|
+
Zuplo uses Auth0 to manage enterprise SSO, so it can support essentially any SSO
|
|
90
|
+
provider required. Common options are Microsoft Entra ID, Okta, Google
|
|
91
|
+
Workspace, etc.
|
|
90
92
|
|
|
91
93
|
### What happens when SSO is enabled for my organization?
|
|
92
94
|
|
|
93
95
|
When SSO is enabled, you'll use your organization's identity provider (like Okta
|
|
94
|
-
or
|
|
95
|
-
access management for your team.
|
|
96
|
+
or Microsoft Entra ID) to log into Zuplo. This provides enhanced security and
|
|
97
|
+
streamlines access management for your team.
|
|
96
98
|
|
|
97
99
|
If you previously had a Zuplo account with the same email address, your SSO
|
|
98
100
|
login will be treated as the primary method going forward.
|
|
@@ -27,8 +27,12 @@ When you first open the API Key Bucket, you won't have any API Keys created.
|
|
|
27
27
|
To add a new API Key Consumer click the **Create Consumer** button and complete
|
|
28
28
|
the form.
|
|
29
29
|
|
|
30
|
+
<ModalScreenshot>
|
|
31
|
+
|
|
30
32
|

|
|
31
33
|
|
|
34
|
+
</ModalScreenshot>
|
|
35
|
+
|
|
32
36
|
Once a consumer is created, you can view or copy the API Key by clicking the
|
|
33
37
|
icons shown.
|
|
34
38
|
|
|
@@ -98,8 +98,12 @@ the API Key Bucket you want to use and click **Create Consumer**. Enter a name
|
|
|
98
98
|
for the consumer. Set the metadata to include the `testApiKey` flag as shown
|
|
99
99
|
below.
|
|
100
100
|
|
|
101
|
+
<ModalScreenshot>
|
|
102
|
+
|
|
101
103
|

|
|
102
104
|
|
|
105
|
+
</ModalScreenshot>
|
|
106
|
+
|
|
103
107
|
Now when you call the API with the test API Key, the `monetization-inbound`
|
|
104
108
|
policy will be bypassed.
|
|
105
109
|
|
|
@@ -29,10 +29,14 @@ code, see the
|
|
|
29
29
|
To set environment variables in your project, click **Settings** and then select
|
|
30
30
|
**Environment Variables**.
|
|
31
31
|
|
|
32
|
-
To create a new variable, click **Add
|
|
32
|
+
To create a new variable, click **Add variable**.
|
|
33
|
+
|
|
34
|
+
<ModalScreenshot>
|
|
33
35
|
|
|
34
36
|

|
|
35
37
|
|
|
38
|
+
</ModalScreenshot>
|
|
39
|
+
|
|
36
40
|
Enter the name and value of your environment variable and select if you would
|
|
37
41
|
like the value to be a secret or a regular value.
|
|
38
42
|
|
|
@@ -120,8 +120,8 @@ portal.zuplo.com but you can switch into those environments to perform a number
|
|
|
120
120
|
of functions, such as:
|
|
121
121
|
|
|
122
122
|
- edit API consumers for this environment
|
|
123
|
-
- view analytics for this environment
|
|
124
|
-
|
|
123
|
+
- view logs, traces, and analytics for this environment in the **Observability**
|
|
124
|
+
tab
|
|
125
125
|
|
|
126
126
|
## Different Backends per Environment
|
|
127
127
|
|
|
@@ -132,8 +132,10 @@ project's working copy — it only works in projects
|
|
|
132
132
|
|
|
133
133
|
1. **Install the plugin**
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
Check `docs/package.json` first — new projects ship with
|
|
136
|
+
`@zudoku/plugin-graphql` already listed in `dependencies`, so there's nothing
|
|
137
|
+
to install. Only older projects need to add it. In your project's `docs/`
|
|
138
|
+
folder (where `zudoku.config.tsx` lives), install the plugin:
|
|
137
139
|
|
|
138
140
|
```bash
|
|
139
141
|
npm install @zudoku/plugin-graphql
|
|
@@ -141,30 +143,10 @@ project's working copy — it only works in projects
|
|
|
141
143
|
|
|
142
144
|
The plugin requires `zudoku` `0.80.1` or newer.
|
|
143
145
|
|
|
144
|
-
2. **
|
|
145
|
-
|
|
146
|
-
Drop a GraphQL schema definition language (SDL) file next to your config:
|
|
147
|
-
|
|
148
|
-
```graphql title="schema.graphql"
|
|
149
|
-
type Query {
|
|
150
|
-
product(id: ID!): Product
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
type Product {
|
|
154
|
-
id: ID!
|
|
155
|
-
name: String!
|
|
156
|
-
price: Float!
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Don't have an SDL file handy? Skip this step and introspect a live endpoint
|
|
161
|
-
at build time with `type: "url"` in the next step — the schema is fetched for
|
|
162
|
-
you when the portal builds.
|
|
163
|
-
|
|
164
|
-
3. **Register the plugin**
|
|
146
|
+
2. **Register the plugin**
|
|
165
147
|
|
|
166
148
|
Import `graphqlPlugin` and add an instance per API. The `path` is where the
|
|
167
|
-
docs mount, and `input` points at your
|
|
149
|
+
docs mount, and `input` points at your GraphQL endpoint:
|
|
168
150
|
|
|
169
151
|
```tsx title="zudoku.config.tsx"
|
|
170
152
|
import { graphqlPlugin } from "@zudoku/plugin-graphql";
|
|
@@ -172,15 +154,12 @@ project's working copy — it only works in projects
|
|
|
172
154
|
const config = {
|
|
173
155
|
plugins: [
|
|
174
156
|
graphqlPlugin({
|
|
175
|
-
type: "
|
|
176
|
-
input: "
|
|
157
|
+
type: "url",
|
|
158
|
+
input: "https://graphql.example.com/api",
|
|
177
159
|
path: "/graphql/ecommerce",
|
|
178
160
|
options: {
|
|
179
161
|
title: "E-Commerce GraphQL API",
|
|
180
162
|
description: "Products, orders, and customers.",
|
|
181
|
-
playground: {
|
|
182
|
-
endpoint: "https://my-gateway.example.com/graphql",
|
|
183
|
-
},
|
|
184
163
|
},
|
|
185
164
|
}),
|
|
186
165
|
],
|
|
@@ -189,18 +168,23 @@ project's working copy — it only works in projects
|
|
|
189
168
|
export default config;
|
|
190
169
|
```
|
|
191
170
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
171
|
+
With `type: "url"`, the schema is fetched via introspection when the portal
|
|
172
|
+
builds, and the playground sends operations to that same URL by default.
|
|
173
|
+
Point `input` at the gateway route from the first half of this guide so
|
|
174
|
+
readers run real queries through your gateway — or keep the playground
|
|
175
|
+
separate from the schema source with `options.playground.endpoint`.
|
|
176
|
+
|
|
177
|
+
Have a GraphQL schema definition language (SDL) file instead of a live
|
|
178
|
+
endpoint? Use `type: "file"` and set `input` to the file's path (for example
|
|
179
|
+
`./schema.graphql`). A file-based schema doesn't tell the plugin where your
|
|
180
|
+
API lives, so also set `options.playground.endpoint` — without it the
|
|
181
|
+
reference pages still render, but the playground asks for an endpoint before
|
|
182
|
+
it can run operations.
|
|
197
183
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
playground defaults to that same URL. You can register the plugin more than
|
|
201
|
-
once to document several schemas, each with its own `path`.
|
|
184
|
+
You can register the plugin more than once to document several schemas, each
|
|
185
|
+
with its own `path`.
|
|
202
186
|
|
|
203
|
-
|
|
187
|
+
3. **Link it in the navigation**
|
|
204
188
|
|
|
205
189
|
Point a navigation link at the instance's `path`. Set `stack: true` so the
|
|
206
190
|
API's own pages render as a stacked sub-navigation instead of expanding
|
|
@@ -39,7 +39,8 @@ If you're not familiar with Zuplo, it's recommended to go through
|
|
|
39
39
|
|
|
40
40
|
1. Create an **MCP Server**
|
|
41
41
|
|
|
42
|
-
On your `routes.oas.json` file, choose **Add** and then **
|
|
42
|
+
On your `routes.oas.json` file, choose **Add** and then **Dynamic OpenAPI to
|
|
43
|
+
MCP Server**.
|
|
43
44
|
|
|
44
45
|

|
|
45
46
|
|
|
@@ -21,8 +21,12 @@ If you're not familiar with Zuplo, it's recommended to go through the
|
|
|
21
21
|
Let's import an OpenAPI document. You can download this one here
|
|
22
22
|
[todo-openapi.json](https://download-open-api-main-fae215f.d2.zuplo.dev/todo-openapi).
|
|
23
23
|
|
|
24
|
+
<ModalScreenshot size="sm">
|
|
25
|
+
|
|
24
26
|

|
|
25
27
|
|
|
28
|
+
</ModalScreenshot>
|
|
29
|
+
|
|
26
30
|
Select the **Code** tab (1), then choose the `routes.oas.json` file (2) and
|
|
27
31
|
choose **Import OpenAPI** (3).
|
|
28
32
|
|
|
@@ -49,7 +53,8 @@ If you're not familiar with Zuplo, it's recommended to go through the
|
|
|
49
53
|
|
|
50
54
|
1. Create an **MCP Server**
|
|
51
55
|
|
|
52
|
-
On your `routes.oas.json` file, choose **Add** and then **
|
|
56
|
+
On your `routes.oas.json` file, choose **Add** and then **Dynamic OpenAPI to
|
|
57
|
+
MCP Server** (3)
|
|
53
58
|
|
|
54
59
|

|
|
55
60
|
|
|
@@ -10,8 +10,8 @@ tags:
|
|
|
10
10
|
|
|
11
11
|
Sometimes multiple types of authentication are needed on an API. For example, an
|
|
12
12
|
API could support JWT Authentication and API Key authentication or two different
|
|
13
|
-
OAuth providers (for example
|
|
14
|
-
Configuring multiple policies in Zuplo can be done in several ways.
|
|
13
|
+
OAuth providers (for example Microsoft Entra ID for employees and Auth0 for
|
|
14
|
+
partners). Configuring multiple policies in Zuplo can be done in several ways.
|
|
15
15
|
|
|
16
16
|
## JWT and API Key Authentication
|
|
17
17
|
|
|
@@ -15,7 +15,8 @@ this is an OpenAPI document used for routing.
|
|
|
15
15
|
You can use the Route Designer to build your routes, which will be creating an
|
|
16
16
|
OpenAPI document in the background for you (check it out in the **JSON View**).
|
|
17
17
|
|
|
18
|
-
You can also **import an OpenAPI** document by clicking the **
|
|
18
|
+
You can also **import an OpenAPI** document by clicking the **Import** button in
|
|
19
|
+
the Route Designer.
|
|
19
20
|
|
|
20
21
|

|
|
21
22
|
|
|
@@ -39,8 +40,12 @@ document and will keep your Zuplo settings intact, while overwriting everything
|
|
|
39
40
|
else from your imported OpenAPI docs. This creates a great workflow, whatever
|
|
40
41
|
toolset you use.
|
|
41
42
|
|
|
43
|
+
<ModalScreenshot>
|
|
44
|
+
|
|
42
45
|

|
|
43
46
|
|
|
47
|
+
</ModalScreenshot>
|
|
48
|
+
|
|
44
49
|
What's more, you can now have more confidence that your OpenAPI represents the
|
|
45
50
|
truth of your API implementation - because it now drives the configuration of
|
|
46
51
|
your gateway.
|
|
@@ -23,8 +23,12 @@ disconnect the project from Source Control.
|
|
|
23
23
|
Next create a new project in the correct account if moving accounts or with the
|
|
24
24
|
correct name. Choose the `Advanced` option on the new project dialog.
|
|
25
25
|
|
|
26
|
+
<ModalScreenshot>
|
|
27
|
+
|
|
26
28
|

|
|
27
29
|
|
|
30
|
+
</ModalScreenshot>
|
|
31
|
+
|
|
28
32
|
You should see a list of organizations and repositories - pick the source
|
|
29
33
|
repository you wanted to move and click **Create Project from repository**.
|
|
30
34
|
|