Apigee Fundamentals: Architecture and Request Flow
Learn how Apigee is organised (organization, environments, groups, instances), how a request travels through a proxy, and when Apigee is the right gateway.
What you'll learn: By the end of this lesson you can draw how Apigee is organised (control plane, runtime plane, organization, environments, environment groups, instances), trace one request through proxy and target flows, explain how API proxies, API products, developer apps and keys relate, and decide whether Apigee, a lighter gateway or a service mesh fits a given problem.
Think of airport security. Passengers do not walk straight onto an aircraft. They pass one controlled checkpoint where their identity is checked, their luggage is weighed against an allowance, and anything unusual is turned back. The airline's planes (your backends) stay focused on flying. The checkpoint (the gateway) enforces the rules for everyone, the same way every time.
Apigee is Google Cloud's product for building that checkpoint for APIs. This lesson gives you the mental model you need before writing a single policy: what the pieces are called, where they run, and what happens to a request from the moment it arrives until the response leaves.
The core idea
Apigee puts a proxy layer in front of your backend services. Clients call the proxy, never the backend. The proxy runs policies (small, single-purpose processing steps) on the way in and on the way out, then forwards the call. Because the proxy is a separate facade, you can change the backend without breaking the apps that call it, and you can add security, quotas and analytics without touching backend code.
Three ideas carry the rest of the course:
Two planes. Configuration and management happen in a control plane (also called the management plane in the Apigee hybrid docs). Every API call is processed in the runtime plane. A request never waits on the control plane.
A pipeline of flows. A proxy is a request pipeline and a response pipeline, with a client-facing half (the proxy endpoint) and a backend-facing half (the target endpoint). Policies sit in ordered steps inside those flows.
Proxies are not products. An API proxy is the technical facade. An API product packages proxies into something developers can be granted. A developer app holds the credentials that get a caller access to products. Mixing these up is the most common beginner confusion.
Why an API gateway at all
Without a gateway, each service re-implements the same cross-cutting work: checking credentials, rate limiting, translating formats, logging and counting calls. That work drifts between teams and languages, and a security fix has to be rolled out service by service.
A gateway centralises it:
Security. Verify an API key or token once, at the edge.
Traffic control. Reject over-quota or spiking callers before they reach a backend.
Mediation. Translate formats (for example XML to JSON), reshape URLs and headers, hide backend naming.
Visibility. One place that sees every call, with usage analytics.
Decoupling. The public contract stays stable while backends change underneath it.
What a gateway should not become is a second application. Apigee's own best-practice guidance says to keep business logic out of the gateway: if a callout routinely takes more than a second, that logic probably belongs in the underlying service. For the generic version of this argument (and how a gateway differs from a service mesh), read API gateway and service mesh.
Apigee architecture: control plane and runtime plane
Apigee's documentation describes two planes. The terminology page defines the control plane as the part that handles API proxy and environment configuration and supports functions such as analytics, and directs the data plane. The runtime plane is where API creation, security and operations meet traffic: all API traffic is processed here. (The Apigee hybrid pages use the words "management plane" for the same Google-hosted side. Treat the two names as the same idea.)
The practical meaning: you design and deploy proxies against the control plane (through the Cloud console, the Apigee API, or tooling that calls it), and the control plane publishes that configuration to the runtime. The Apigee docs describe the runtime as containerised services on Kubernetes that Google maintains. In the hybrid variant, the same split exists but you run the runtime plane yourself. API calls are processed in the runtime plane, not by a call to the control plane.
How a call reaches the runtime in the fully managed product depends on the networking option you pick at provisioning:
Northbound traffic is client to Apigee. It arrives at a Google Cloud load balancer (an external load balancer in the documented setups).
Southbound traffic is Apigee to your target services.
With VPC peering, your VPC and the Apigee-managed network are linked with private service access; the docs also describe routing northbound traffic through a managed instance group. With Private Service Connect (PSC), northbound traffic reaches a service attachment and southbound traffic to private backends uses an endpoint attachment. Each choice has trade-offs and some features (for example VPC Service Controls) are only supported with one option. Check the networking options page before provisioning, because the hosting region and some network choices cannot be changed afterwards.
How to read it: requests only travel along the solid line from the client to your backends. The dashed line is configuration flowing from the control plane to the runtime when you deploy. Analytics data is also collected without sitting in the request path (see the analytics section below).
Organization, environments, groups and instances
These four words appear in every Apigee conversation. The official terminology page defines them like this, in plain terms:
Term
What it is
What to remember
Organization
The container for all Apigee resources in one Google Cloud project: proxies, products, apps, developers
One organization maps to exactly one Google Cloud project and shares its name. It is not a Google Cloud organization, and its name cannot be changed.
Environment
An isolated space inside the organization where proxies are deployed
You deploy a proxy to an environment. A proxy must be deployed before anyone can call it.
Environment group
A set of environments that share one or more hostnames
Hostnames are defined on the group, not on the environment. Each hostname belongs to exactly one group. Wildcards are not supported.
Instance (runtime instance)
A deployment of the Apigee runtime in a Google Cloud region
At most one per region. Environments attach to an instance. Several instances give cross-region availability.
Environment groups are the part that surprises newcomers, so here is the routing rule. A full URL has three parts. The hostname comes from the environment group, the base path is set by the proxy, and the rest is the resource path. Apigee uses the group's hostnames to decide which environments can serve a request, then matches the base path to a deployed proxy.
The documentation's own example: a prod-group containing three environments with hostnames catalog.example.com and payment.example.com. A catalog proxy on base path /catalog is reached at catalog.example.com/catalog. A cart proxy on /catalog/cart is reached at catalog.example.com/catalog/cart. Two details follow:
An environment can belong to more than one group. A proxy deployed in it then gets one address per group (for example one hostname per partner). Every deployment can therefore influence routing for every group the environment is in.
To restrict a proxy to one audience, give that environment its own group with its own hostname.
If two deployments claim the same base path on the same route, Apigee reports a routing conflict on the deployment: the deployment does not enter an error state, but some base paths stop being routed to it. The docs describe base-path uniqueness at slightly different scopes in different pages (per environment, per environment group). The safe rule is to never reuse a base path on a hostname that more than one deployment serves.
Apigee hierarchy: one organization, instances per region, environment groups that own hostnamesApigee organization to Runtime instance (contains); Apigee organization to Environment group (contains); Runtime instance to Environments (hosts); Environment group to Environments (hostnames); Environments to API proxies (deploy to)Apigee organization: 1 per projectApigeeorganization1 per projectRuntime instance: one per regionRuntimeinstanceone per regionEnvironment group: owns hostnamesEnvironmentgroupowns hostnamesEnvironments: test, prod, ...Environmentstest, prod, ...API proxies: deployed revisionsAPI proxiesdeployedrevisionscontainscontainshostshostnamesdeploy to
How to read it: the instance provides the runtime capacity in a region, environments are the isolated places proxies are deployed, and the group maps hostnames onto environments. Which environments sit in which groups is your design decision. A common start is one group for production traffic and a separate group (with its own hostname) for non-production.
The request lifecycle
Now the central picture. A proxy has a proxy endpoint (how clients call it: the base path and connection settings) and a target endpoint (how Apigee calls the backend: URL, security and connection settings). Each endpoint has a request side and a response side, built from the same flow segments.
The flow segments, as the documentation defines them:
PreFlow runs first, every time. It is the right place for checks that must always happen, such as verifying a key.
Conditional flows run next. Each has a <Condition> built from flow variables. Only one runs per segment: the first whose condition is true. The condition is evaluated once and applies to both request and response.
PostFlow runs after the conditional flows. Use it for logging or response shaping.
PostClientFlow exists only on the proxy endpoint and runs after the response has been sent to the client. It allows only a small set of policy types (FlowCallout, MessageLogging, ServiceCallout) and is meant for final logging.
The full order on the way in is: proxy PreFlow, proxy conditional flow, proxy PostFlow, then (after the RouteRule picks a target) target PreFlow, target conditional flow, target PostFlow, then the call to the backend. The response comes back through the target response flows, then the proxy response flows. Note that the proxy endpoint's PostFlow finishes before the target endpoint's PreFlow begins.
sequenceDiagram
participant C as Client app
participant L as Load balancer
participant P as Proxy endpoint
participant T as Target endpoint
participant B as Backend
C->>L: GET /orders-api/v1/... with API key
L->>P: forward to Apigee runtime
Note over P: Request: PreFlow, conditional flow, PostFlow
P->>T: RouteRule selects target
Note over T: Request: PreFlow, conditional flow, PostFlow
T->>B: call backend
B-->>T: backend response
Note over T: Response flows run
T-->>P: response
Note over P: Response flows run
P-->>L: response
L-->>C: response
Note over P: PostClientFlow runs after the response is sent
How to read it: the notes mark where your policies can run. If a request fails in a policy, Apigee stops the normal pipeline and enters fault handling (lesson 7 covers it). A step in a flow can also carry its own condition, and a RaiseFault step can deliberately fail a request.
The RouteRule decides which target the request goes to. The documentation lists four shapes: a named target endpoint, a direct URL (no target endpoint file, so only proxy endpoint flows can hold policies), conditional rules that choose among several targets, and a null route that calls no backend and lets the proxy build the response itself. The first matching rule wins, so put conditional rules first and the unconditional default last.
Flow variables and the message model
Policies do not pass data to each other directly. They read and write flow variables: named values that hold the state of one API transaction. Apigee fills in many of them automatically (request details, system values, the target's response), and policies add more as they run (for example the app name after a key check).
A few built-in variables from the reference, with their documented meaning:
Variable
Meaning
proxy.pathsuffix
The part of the path after the proxy endpoint's base path (read only).
request.verb
The HTTP method of the request.
client.ip
IP address of the client or system that sent the message to the load balancer.
target.url
The target URL from the TargetEndpoint, or a dynamic URL set during the flow (read/write).
Which proxy, environment and organization handled the call.
message.content, message.header.<name>
The content or a header of whichever message is current: message mirrors the request in the request flow and the response in the response flow.
Two rules save a lot of debugging. First, variables have a scope: reading one before the point where it is populated gives null or an error (the response variable, for example, exists only from the target response onward). Second, the syntax differs by context: inside a policy you write the name in braces ({client.ip}), and inside a <Condition> you write it bare (request.verb = "POST"). In JavaScript policies you use context.getVariable() and context.setVariable().
A minimal proxy as files
An API proxy is a bundle of XML files. This minimal outline shows the proxy endpoint, one policy in the PreFlow, and the route. The four snippets below are, in order, apiproxy/proxies/default.xml, apiproxy/policies/VA-VerifyKey.xml, apiproxy/policies/AM-AddAppHeader.xml and apiproxy/targets/default.xml. The proxy endpoint verifies the key first and routes to the target; the target endpoint calls the backend after adding a header.
The key comes from a header on purpose: the VerifyAPIKey reference notes that putting the key in a header is the better practice. On success the policy sets flow variables prefixed verifyapikey.VA-VerifyKey, including client_id, developer.app.name and apiproduct.name. A failed check returns a 401 for faults such as oauth.v2.InvalidApiKey and oauth.v2.FailedToResolveAPIKey.
Those variables make the next policy possible: pass the caller's app name to the backend as a header, and strip the credential before the call leaves Apigee.
Actions inside one AssignMessage run in the order written, so Remove before Set is deliberate. mocktarget.apigee.net is the hosted mock service that Apigee's own getting-started guide uses as a target.
Proxy, product, developer app and credentials
Four objects, four jobs. Keep them apart and most access-control questions answer themselves.
Object
Job
Created by
Example
API proxy
The technical facade: endpoints, flows, policies, a base path
API developers
orders-api at /orders-api/v1
API product
A bundle of one or more operations (a proxy plus resource paths, optionally restricted by HTTP method, optionally with a quota) offered to developers
API product managers
"Partner Basic": GET on /orders
Developer app
A registration that lets a developer use products. Apigee generates a credential for it when it is associated with a product
The consuming developer or an admin
acme-erp-integration
Credentials
The consumer key (and secret) generated for the app, tied to its products
Apigee, on app creation
Sent as an API key, or exchanged for an OAuth token
The documentation stresses a point that is easy to miss: API keys are issued for API products, not for APIs. When a call arrives, Apigee checks the credential, finds the products attached to it, confirms the proxy, path and method are allowed, checks quota, and confirms the key, app and developer are active and not revoked. Two consequences are security-critical:
A proxy must actually verify. Products grant access, but nothing is enforced unless the proxy contains a VerifyAPIKey or VerifyAccessToken step. Without one, any caller can invoke the API.
Product scope matters. The documentation says that if no environments are specified, all environments are allowed by the product. For proxies, always list the ones the product covers rather than relying on a default.
A quota set on a product does not enforce itself either. It is a default that a Quota policy reads (through variables such as verifyapikey.<policy>.apiproduct.developer.quota.limit), and the verification policy must run before the Quota policy.
How to read it: access runs from developer to app to product to operation to proxy. A revision is a numbered snapshot of a proxy's configuration; revision numbers are internal and unrelated to your public API version.
Apigee, Apigee hybrid and Edge
Google's documentation presents two current deployment options: Apigee (cloud-hosted; Google maintains the environment) and Apigee hybrid (a runtime plane that you install on-premises or in your chosen cloud, paired with a management plane hosted in Google's cloud). Older pages and the Edge migration pages call the cloud-hosted product Apigee X, and this course uses that name where it helps. Apigee Edge is the previous generation, documented separately (Public Cloud as hosted SaaS, Private Cloud as an on-premises install).
Apigee (X)
Apigee hybrid
Apigee Edge
Where the runtime runs
Google-maintained runtime
Your Kubernetes platform, on-premises or cloud
Public Cloud: hosted. Private Cloud: your hardware
Management side
Google
Google-hosted management plane
Edge's own management
API traffic and data
Processed in Google's runtime
Stay inside your approved boundary
Depends on the variant
Access control
Google Cloud IAM
Google Cloud IAM
Edge's own user roles
Choose it when
Default for new work
Data residency, on-premises or latency-to-backend reasons
You already run it, or you are planning a migration
A few documented migration differences from the Edge-to-X comparison page, because they bite during moves: roles move to Google Cloud IAM, Node.js proxies and hosted targets are not supported in X, the StatisticsCollector policy is replaced by DataCapture, and trace in X is asynchronous with a slight delay while Edge trace is real time. The same page lists limits that differ between the two products, so check the limits pages for the product you run. Concepts in this course carry across all variants; examples target the cloud-hosted product.
Analytics at a glance
For every call Apigee records default data, including the URL, IP address and user ID. Policies can capture more (headers, query parameters, or fields taken from the body). Collection is asynchronous, so it does not slow the API. You read the results as trends and reports in the Apigee UI, or fetch them through the Analytics Service by command line or REST. Lesson 7 returns to this for monitoring and troubleshooting.
Hands-on: your first proxy, product and app
This sequence uses an evaluation organization (see the course overview for how to get one) and the hosted mock backend, so there is nothing to build before you start.
Create the proxy. In the Google Cloud console go to Apigee, then Proxy development, then API proxies, and click Create. Pick the "Reverse proxy (Most common)" template, name it orders-api, and set the target to https://mocktarget.apigee.net. The console fills the base path from the name; set it to /orders-api/v1 if you want it to match this lesson.
Add the policies. Add the VA-VerifyKey step in the proxy endpoint PreFlow and AM-AddAppHeader in the target endpoint PreFlow, using the XML above.
Deploy the revision to your evaluation environment and note the hostname of its environment group (the evaluation wizard names the group eval-group and the environment eval, and creates a hello-world proxy you can call first).
Create a product, developer and app with the Apigee API. The shell below assumes gcloud is signed in and ORG is your project ID:
TOKEN=$(gcloud auth print-access-token)
ORG=my-project-id # the Apigee organization name equals the project ID
BASE=https://apigee.googleapis.com/v1/organizations/$ORG# 1) API product: allow the proxy in the eval environment. Quota fields are strings in the API.
curl -s -X POST "$BASE/apiproducts" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"partner-basic","displayName":"Partner Basic","approvalType":"auto",
"environments":["eval"],"proxies":["orders-api"],
"quota":"100","quotaInterval":"1","quotaTimeUnit":"minute"}'# 2) Developer (email must be lowercase)
curl -s -X POST "$BASE/developers" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"email":"dev@example.com","firstName":"Test","lastName":"Developer","userName":"testdev"}'# 3) App tied to the product; Apigee generates a key. Read credentials[].consumerKey in the response.
curl -s -X POST "$BASE/developers/dev@example.com/apps" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"acme-erp-integration","apiProducts":["partner-basic"]}'
Call it with and without the key:
HOST=your-envgroup-hostname.example.com # from your environment group
curl -i "https://$HOST/orders-api/v1"# expect 401: no key
curl -i -H "x-api-key: $KEY""https://$HOST/orders-api/v1"# expect 200 from the mock target
Debug. Start a debug session on the proxy in the console, repeat the call, and open the transaction. Find the VerifyAPIKey step, read the variables it set, then find the header AM-AddAppHeader added to the target request.
Remember: the quota on the product does nothing yet. No Quota policy reads it, which is exactly the situation lesson 6 fixes.
Three use cases
1. Expose a legacy backend as a clean REST API. An internal system returns XML on awkward URLs. A proxy gives it a tidy base path, a route rule to the old URL, and mediation policies such as XMLtoJSON and AssignMessage to translate payloads and headers. Clients see a stable JSON contract; the backend team can replace the system later without a client change. Keep transformations declarative and small, and push real business rules back into the backend.
2. A partner API programme with keys and quotas. Partners register apps, receive keys, and are granted products. Two products on the same proxy (a low limit and a higher limit) create service tiers without a second proxy. VerifyAPIKey identifies the app and product, and a Quota policy reads the product's limits. Analytics then show which partner uses what.
3. A mobile backend facade (BFF). A mobile app wants one call, small payloads and a stable contract across app versions. A proxy can call several backends with a ServiceCallout policy, combine results, and trim fields, so the phone makes one round trip. Use sparingly: heavy aggregation belongs in a dedicated service, with Apigee in front for security and traffic control (see the Backend for Frontend section in API gateway and service mesh).
Apigee, a lightweight gateway or a service mesh
Apigee is an API management product: gateway plus products, apps, keys, analytics and a developer-facing lifecycle. That is more than many systems need. The comparison below is about the shape of the problem, not about specific competing products.
Question
Apigee (API management)
Lightweight gateway or reverse proxy
Service mesh
Main job
Manage APIs as products for external or many internal consumers
Route, terminate TLS, basic auth and rate limits
Secure and observe service-to-service (east-west) traffic
Consumer lifecycle (keys, apps, products, portal, analytics per consumer)
Built in
You assemble it
Not its purpose
Policy changes by a platform team, no backend deploys
Yes, declarative policies
Depends on the product
Yes, for network policy
Operational weight
Managed service, but you design environments, proxies, pipelines
Low
High (control plane, sidecars)
Fits best
Partner programmes, monetised or governed APIs, many teams sharing a gateway
A handful of services, internal APIs, early stage
Many internal services needing mTLS and uniform telemetry
flowchart TD
A{"Are APIs consumed by external partners or several independent teams?"} -->|no| B{"Do you only need routing, TLS and basic limits?"}
A -->|yes| C{"Need keys per consumer, products, quotas and usage analytics?"}
B -->|yes| D["Reverse proxy or lightweight gateway"]
B -->|no| C
C -->|yes| E["API management: Apigee"]
C -->|no| D
E --> F{"Also need mTLS and telemetry between many internal services?"}
D --> F
F -->|yes| G["Add a service mesh for east-west traffic"]
F -->|no| H["Stop here: fewer moving parts"]
How to read it: the first split asks whether you manage APIs as products for consumers. A mesh is an additional layer for a different traffic direction; it does not replace the gateway, and the gateway does not replace it.
In practice: opening a legacy order system to partners
NOTE
A realistic scenario, not a case history. This is a composite example built from common production patterns. It does not describe any specific company, and every number in it is an illustrative assumption.
The situation
A parts distributor runs an in-house order system that returns XML. About 40 partner companies (assumed) pull order status through a reverse proxy that checks a single shared credential. Every partner uses the same secret, so one leak means rotating it for everyone. Two partners hammer the endpoint with polling loops and slow it for the rest. Nobody can say which partner generates which traffic, and the partners' IP allow-lists are maintained by hand.
Starting architecture
Starting architecture: one shared credential at an Nginx reverse proxy in front of the legacy order systemPartner A systems to Nginx reverse proxy (shared secret); Partner B systems to Nginx reverse proxy (shared secret); Nginx reverse proxy to Legacy order system (XML); Legacy order system to Order databasePartner A systems: frequent pollingPartner Asystemsfrequent pollingPartner B systems: nightly batchPartner Bsystemsnightly batchNginx reverse proxy: one shared secretNginx reverseproxyone shared secretLegacy order system: XML, awkward URLsLegacy ordersystemXML, awkward URLsOrder databaseOrder databaseshared secretshared secretXML
How to read it: identity stops at the proxy. The backend cannot tell partners apart, and there is no per-partner limit.
What changes
Provision and map names. Provision an organization, create a partners-prod environment, and put it in an environment group with the hostname api.partners.example.com (assumed).
Build orders-api. Base path /orders-api/v1, target URL the legacy system. Add VA-VerifyKey in the proxy PreFlow, an XMLtoJSON policy in the response flow, and AM-AddAppHeader so the backend logs which app called.
Define two products. "Partner Basic" and "Partner Plus" on the same proxy, each with its own quota values, each requiring manual approval so the partner manager vets new apps.
Onboard partners one by one. Each partner gets a developer record and an app with its own key. Run the old reverse proxy in parallel while partners switch, then retire the shared secret.
Lock the backend. Allow inbound connections to the legacy system only from the Apigee southbound path (how depends on whether you chose VPC peering or Private Service Connect), so the old route is closed rather than merely unused.
flowchart LR
S1["1. Proxy deployed, shared secret still live"] --> S2["2. Pilot partner moves to its own key"]
S2 --> S3["3. Remaining partners move in batches"]
S3 --> S4["4. Shared secret disabled"]
S4 --> S5["5. Backend accepts only the Apigee path"]
Each stage is reversible until stage 4, because the old path keeps working. Watch error rates per app in analytics before moving on.
Result
Each partner has its own credential that can be revoked without touching the others. Analytics split traffic per app, so the two heavy pollers are visible and can be moved to a lower tier or asked to back off. Product quotas, once enforced by a Quota policy, protect the legacy system from a single partner's loop. The backend team is free to modernise the system later because partners depend on the proxy's JSON contract, not on the old XML. The new costs are real: environments and proxy bundles to maintain, a pipeline to ship them, and a gateway whose availability now matters to every partner.
Architect's notes
Design the organization on purpose. Because an organization maps to one Google Cloud project and cannot be renamed, decide early whether non-production and production share an organization (separate environments) or use separate organizations and projects. Separate organizations isolate more but multiply tooling.
Name hostnames after audiences, not environments. Environment and group names never appear in the URL; hostnames do. A group per audience (internal, partner, public) is easier to reason about than a group per stage.
Treat base paths as a contract. Reserve and document them. Conflicts surface at deploy time as routing conflicts, not as errors.
Keep the gateway thin. Use built-in policies before custom code, and keep business rules in services. A slow callout is a signal the logic is in the wrong place.
Know which choices are permanent. The hosting region and encryption key cannot be changed after provisioning, and an evaluation organization cannot be converted to a paid one.
Plan for the gateway being critical. Every call now crosses it, so capacity, regional instances and monitoring belong in the design from the start.
Do not forget the backend. Gateway checks do not replace backend authorisation. Treat the gateway as the first lock on the door, not the only one.
Common mistakes
Assuming a product protects the proxy. Without a VerifyAPIKey or VerifyAccessToken step in the proxy, any caller can invoke it. Add the verification policy to the PreFlow.
Creating a product with no proxies or environments. An unscoped product can allow every environment, and an unclear proxy list is a risk you do not need. Always list the proxies and environments.
Expecting product quotas to enforce themselves. They are only values. Add a Quota policy that reads them, after the verification policy.
Reading a flow variable too early.response.* does not exist in the request flow. Check the variable's scope in the reference.
Putting the API key in the query string. URLs are logged everywhere. Use a header, and remove the key before forwarding to the backend.
Reusing a base path across deployments. It creates a routing conflict: the deployment is not in an error state, but some of its traffic is not routed. Reserve paths.
Putting business logic in the gateway. It couples teams to one deployable. Keep it to security, traffic and mediation.
Treating the evaluation organization like production. It lasts 60 days, is deleted afterwards, has no SLA and is not suitable for load tests.
Key takeaways
Apigee is a proxy layer that adds security, traffic control, mediation and analytics in front of backends without changing them.
The control plane configures and manages; the runtime plane processes all API traffic and does not depend on a call to the control plane per request.
An organization maps to one Google Cloud project; environments are isolated deployment spaces; environment groups own hostnames; instances are regional runtimes.
A request runs proxy PreFlow, conditional flow and PostFlow, then the RouteRule picks a target and the target flows run; the response comes back through target then proxy flows.
Policies communicate through flow variables, so learn the variable scope before writing conditions.
Proxies, products, developer apps and credentials are different objects: keys are issued for products, and the proxy must verify them.
Apigee, hybrid and Edge share concepts, but IAM, supported policies and some features differ; check the migration comparison before moving.
Choose Apigee when APIs are products with consumers; use a lighter gateway for simple routing and a mesh only for east-west needs.
Practice exercises
Starter (about 30 min): Draw the hierarchy of an organization that has dev, test and prod environments, two environment groups (internal and partner) and one instance. Label which hostnames belong to which group, and write the full URL of a proxy with base path /orders-api/v1 for each group. Then list, in order, every flow segment a request passes through from the client to the backend.
Intermediate (about 2 h): Provision an evaluation organization with the console wizard, build the orders-api reverse proxy against https://mocktarget.apigee.net, add VA-VerifyKey and AM-AddAppHeader, create a product, developer and app with the three curl commands, and call the proxy with and without a key. In Debug, record the value of verifyapikey.VA-VerifyKey.apiproduct.name and the headers on the target request. Write two sentences explaining why the product's quota did not stop any call.
Advanced (half a day): Take a real or invented backend with three resources (/orders, /orders/{id}, /customers). Design the proxy: base path, conditional flows per resource and method, a RouteRule, and two products with different operation sets. Document the environment and hostname plan for internal and partner audiences, including what happens if the same environment joins both groups. Then write a one-page decision record choosing between Apigee, a lightweight gateway and a gateway plus mesh for this system, listing the evidence that would change your answer.
Lesson 2 of 11 · Apigee API Management: Beginner to Advanced
Learn how Apigee is organised (organization, environments, groups, instances), how a request travels through a proxy, and when Apigee is the right gateway.
In the rest of this lesson
The request lifecycle
Proxy, product, developer app and credentials
Apigee, Apigee hybrid and Edge
Analytics at a glance
Hands-on: your first proxy, product and app
Three use cases
Enrolling is free. It unlocks every lesson in Apigee API Management: Beginner to Advanced, tracks your progress across devices and keeps your quiz scores. The newsletter is optional.
Real architecture decisions, LLMOps patterns that survive production, and engineering leadership advice — from 12+ years of building at enterprise scale. Free. No spam. Unsubscribe anytime.
Get new articles by email
Free. We email a confirmation link first, and you can unsubscribe from any email.