Zuplo
API Best Practices

GitOps for API Management: Platform Comparison and Implementation

Nate TottenNate Totten
February 26, 2026
13 min read

Compare GitOps support across API management platforms — config-as-code, branch previews, CI/CD pipelines, and rollback patterns for Zuplo, Kong, Apigee, and more.

GitOps has changed how teams deploy and manage infrastructure. Instead of clicking through dashboards or running ad-hoc scripts, you define your desired state in Git, review changes through pull requests, and let automation handle the rest. Merge triggers deploy. Revert triggers rollback. Every change is tracked, attributed, and reversible.

For API management, adopting GitOps means your gateway configuration — routes, policies, authentication rules, and rate limits — lives in version-controlled files rather than in a proprietary dashboard’s database. But not all API platforms support this equally. Some were designed around Git from day one. Others bolt on declarative config as an afterthought. The difference matters when you’re managing dozens of API endpoints across multiple environments with a team that expects modern developer workflows.

This comparison breaks down how six major API management platforms handle GitOps — from config-as-code and branch previews to CI/CD integration and rollback patterns.

What GitOps Means for API Management

Before comparing platforms, it helps to define what a fully GitOps-native API management workflow actually looks like. There are six capabilities that distinguish real GitOps support from “we have a CLI tool.”

Config-as-Code

Routes, policies, authentication schemes, and rate limiting rules are defined in files — JSON, YAML, or similar. No clicking through a UI to create an endpoint. The configuration files are the source of truth.

Version Control

Every change to your API configuration is a Git commit. You know who changed what, when they changed it, and why. Audit trails are built in, not bolted on.

PR-Based Reviews

API changes go through the same code review process as application code. A new rate limiting policy gets a pull request, a review from a teammate, and approval before it touches any environment. This is especially important for security-sensitive changes like authentication configuration.

Automated Deployment

Merging to the main branch triggers deployment automatically. No manual “sync” step, no separate deploy command, no logging into a dashboard to click “publish.”

Branch Preview Environments

When a developer opens a pull request, they get a fully functional preview of their API changes running in an isolated environment. They can test the new route or policy before merge — without affecting staging or production.

Rollback via Git

If a deployment breaks something, rollback is git revert followed by a push. The platform should treat this like any other merge and deploy the previous known good state automatically. No special rollback procedures, no “restore from backup” workflows.

Platform Comparison Matrix

Here is how six major API management platforms stack up across GitOps capabilities:

CapabilityZuploKong (decK)ApigeeAWS API GatewayTykAzure APIM
Config-as-CodeNative (JSON/OAS)YAML (decK)XML proxy bundlesCloudFormation/SAM/CDKJSON/YAML (tyk-sync)ARM/Bicep templates
Git-NativeYes, built-inNo, CLI syncNo, CLI toolingNo, IaC toolingNo, CLI syncNo, IaC tooling
Branch PreviewsAutomaticNot supportedNot supportedNot supportedNot supportedNot supported
CI/CD IntegrationBuilt-inManual setupManual setupManual setupManual setupAPIOps toolkit
Declarative ConfigFully declarativeFully declarativePartially declarativeDeclarative (IaC)DeclarativeDeclarative (IaC)
Rollback MethodGit revert + pushRe-sync previous stateRedeploy proxy bundleStack rollbackRe-sync previous stateTemplate redeployment
Learning CurveLowMediumHighMedium-HighMediumHigh

The fundamental divide is between platforms that are git-native — where Git is the deployment mechanism — and platforms that are git-compatible — where you can store config in Git but need separate tooling to sync it to the platform.

Platform Deep Dives

Zuplo: Git-Native by Design

Zuplo takes a fundamentally different approach from other API gateways. Your gateway is your Git repository. There is no separate control plane database that you sync config to. The files in your repo are the configuration, and every push triggers a build and deployment on Zuplo’s edge network.

A typical Zuplo project structure looks like this:

plaintext
my-api/
  config/
    routes.oas.json        # OpenAPI-based route definitions
    policies.json          # Policy configuration
  modules/
    my-custom-handler.ts   # Custom request/response handlers
  tests/
    my-api.test.ts         # API tests
  zuplo.jsonc              # Project configuration

Routes are defined in an OpenAPI-based JSON file. Policies like rate limiting, authentication, and request validation are attached to routes declaratively. If you need custom logic, you write TypeScript handlers that run on the edge.

What makes this genuinely GitOps:

  • Every branch gets a preview environment. Open a PR, and Zuplo deploys a fully functional copy of your API at a unique URL. You can test new endpoints, changed policies, and updated handlers before merging.
  • Merge to main deploys to production. No separate deploy step, no CLI command, no dashboard interaction.
  • Rollback is git revert. Revert the commit, push, and the previous configuration deploys automatically.
  • No Terraform or CDK required. The project structure itself is the infrastructure definition.

The tradeoff is that Zuplo is a managed platform. You don’t run it in your own infrastructure. For teams that want GitOps without the operational overhead of managing gateway infrastructure, that’s the point.

Kong (Konnect + decK)

Kong is one of the most widely deployed API gateways, and its decK CLI brings declarative configuration to what is traditionally an imperative, admin-API-driven platform.

With decK, you define your Kong configuration in YAML:

YAMLyaml
_format_version: "3.0"
services:
  - name: my-api
    url: http://upstream-service:8080
    routes:
      - name: get-users
        paths:
          - /users
        methods:
          - GET
    plugins:
      - name: rate-limiting
        config:
          minute: 100
          policy: local

You store this file in Git and use deck gateway sync in your CI/CD pipeline to push the configuration to Kong. The workflow looks like:

  1. Developer edits the YAML config file
  2. Opens a pull request for review
  3. CI pipeline runs deck gateway diff to show what will change
  4. After merge, CI runs deck gateway sync to apply changes

This works, but there are important limitations. There are no branch preview environments — you’d need to maintain separate Kong instances and wire up the CI/CD yourself to approximate this. Rollback means checking out a previous Git commit and re-running deck gateway sync. And every environment (dev, staging, production) requires its own sync step with environment-specific overrides.

Apigee

Google’s Apigee is an enterprise API management platform with extensive capabilities, but its GitOps story is more complex. API proxies in Apigee are defined as bundles containing XML configuration, JavaScript callouts, and policy definitions.

The apigeecli tool and Apigee’s management APIs allow you to script deployments, but the configuration format is verbose and the deployment pipeline requires significant setup:

  1. API proxy bundles are XML-based with a specific directory structure
  2. Policies are defined in individual XML files
  3. Deployment requires bundling, uploading, and activating the revision
  4. Environment-specific configuration uses target server references

Teams that want GitOps with Apigee typically build custom CI/CD pipelines using apigeecli or the Apigee Maven plugin. Google provides reference implementations, but you are assembling the pipeline yourself. Branch previews don’t exist natively — you’d need separate Apigee organizations or environments for each developer, which gets expensive.

Rollback means redeploying a previous revision number through the API or CLI. It’s possible, but it’s not as simple as git revert.

AWS API Gateway

AWS API Gateway integrates with the broader AWS infrastructure-as-code ecosystem. You can define APIs using CloudFormation, SAM, or CDK.

A SAM template for an API endpoint looks like this:

YAMLyaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
      Auth:
        ApiKeyRequired: true

  GetUsersFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs20.x
      Events:
        GetUsers:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /users
            Method: GET

  UsagePlan:
    Type: AWS::ApiGateway::UsagePlan
    Properties:
      UsagePlanName: BasicPlan
      Throttle:
        RateLimit: 100
        BurstLimit: 50
      ApiStages:
        - ApiId: !Ref MyApi
          Stage: prod

This is infrastructure-as-code, which overlaps with GitOps but isn’t quite the same thing. The configuration lives in Git and deploys through CI/CD, but:

  • CloudFormation manages state separately from Git (the stack state)
  • Rollback is a CloudFormation stack rollback, not a git revert
  • There are no branch preview environments for API changes
  • The configuration is tightly coupled to AWS-specific resource types
  • Changes to API Gateway often require careful orchestration with Lambda functions, IAM roles, and other AWS services

For teams already deep in the AWS ecosystem, this approach works. But the gap between “config is in Git” and “Git drives everything” is significant.

Tyk

Tyk offers the tyk-sync CLI tool for declarative API management. You can export your API definitions to JSON or YAML files, store them in Git, and sync them back to Tyk using CI/CD pipelines.

Tyk also supports importing OpenAPI specifications directly, which can simplify the initial setup. However, like Kong, the workflow requires you to build the CI/CD pipeline yourself. There are no branch preview environments, and the dashboard remains the primary interface for many configuration tasks.

Tyk’s approach is practical for teams that want version-controlled API config without fully committing to a git-native workflow. The sync tool handles the translation between files in Git and the running gateway state.

Azure API Management

Azure APIM has one of the more comprehensive (and complex) GitOps stories in the enterprise gateway space. Microsoft provides the APIOps toolkit, which includes GitHub Actions and Azure DevOps pipeline templates for extracting and publishing API configurations.

Configuration is expressed as ARM templates or Bicep files. The APIOps toolkit provides an “extractor” that pulls your current APIM configuration into version-controlled files and a “publisher” that pushes changes back.

The approach is capable but has a steep learning curve. ARM templates are verbose, the extraction/publishing pipeline requires careful setup, and the configuration format is deeply tied to Azure resource definitions. For teams already invested in Azure, it’s a workable solution. For teams looking for simplicity, it adds significant overhead.

Config-as-Code Examples

To make the comparison concrete, here is what it looks like to add a route with rate limiting on three platforms.

Zuplo

In Zuplo, you add the route to your routes.oas.json file:

JSONjson
{
  "paths": {
    "/users": {
      "get": {
        "operationId": "get-users",
        "summary": "List users",
        "x-zuplo-route": {
          "handler": {
            "export": "urlRewriteHandler",
            "module": "$import(@zuplo/runtime)",
            "options": {
              "rewritePattern": "https://api.example.com/users"
            }
          },
          "policies": {
            "inbound": ["rate-limit-inbound", "api-key-inbound"]
          }
        }
      }
    }
  }
}

The rate limit policy is defined in policies.json:

JSONjson
{
  "policies": [
    {
      "name": "rate-limit-inbound",
      "policyType": "rate-limit-inbound",
      "handler": {
        "export": "RateLimitInboundPolicy",
        "module": "$import(@zuplo/runtime)",
        "options": {
          "rateLimitBy": "ip",
          "requestsAllowed": 100,
          "timeWindowMinutes": 1
        }
      }
    }
  ]
}

Commit, push, deployed. The configuration is readable, the OpenAPI structure is familiar, and there’s no translation layer between what’s in Git and what’s running.

Kong (decK)

The equivalent Kong configuration in decK YAML:

YAMLyaml
_format_version: "3.0"
services:
  - name: users-service
    url: http://api.example.com
    routes:
      - name: get-users
        paths:
          - /users
        methods:
          - GET
    plugins:
      - name: rate-limiting
        config:
          minute: 100
          policy: local
          limit_by: ip

After committing this file, your CI/CD pipeline needs to run deck gateway sync kong.yaml to apply it to Kong.

AWS API Gateway (SAM)

In SAM, adding a rate-limited route means defining both the function event source and a separate usage plan resource:

YAMLyaml
Resources:
  GetUsersFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: users.handler
      Runtime: nodejs20.x
      Events:
        GetUsers:
          Type: Api
          Properties:
            Path: /users
            Method: GET
            RestApiId: !Ref MyApi

  UsagePlan:
    Type: AWS::ApiGateway::UsagePlan
    Properties:
      UsagePlanName: StandardPlan
      Throttle:
        RateLimit: 100
        BurstLimit: 50
      ApiStages:
        - ApiId: !Ref MyApi
          Stage: prod

This requires a sam deploy command in your pipeline, CloudFormation stack management, and careful handling of API Gateway stage deployments.

Branch Preview Environments

Branch preview environments are one of the clearest differentiators between git-native and git-compatible platforms. The concept is straightforward: when a developer opens a pull request, they should get a fully functional instance of their API running with the proposed changes, accessible at a unique URL.

This matters because API changes are hard to review in a diff viewer alone. A new rate limiting configuration might look correct in YAML, but does it actually throttle requests the way you expect? A rewritten route handler might pass linting, but does the response format match what consumers need? Preview environments let you test API changes before they merge.

Zuplo provides branch previews automatically. Every branch and pull request gets its own deployment at a unique URL (e.g., https://my-api-pr-42.zuplo.dev). Reviewers can make real HTTP requests against the preview to verify behavior. This is built into the platform — no configuration required.

No other major API gateway platform provides automatic branch previews. To approximate this with Kong, Tyk, or AWS API Gateway, you would need to:

  1. Spin up a separate gateway instance per branch
  2. Configure CI/CD to deploy the branch-specific config to that instance
  3. Provide a unique URL or routing mechanism for each preview
  4. Tear down the instance when the branch is merged or closed

This is possible but requires significant infrastructure investment and maintenance. Most teams skip it entirely, which means API changes go through review without being tested in a realistic environment.

CI/CD Pipeline Templates

For platforms that aren’t git-native, you need CI/CD pipelines to bridge the gap between Git and the gateway. Here are practical GitHub Actions examples for two common setups.

Zuplo (Built-In)

Zuplo’s GitHub integration handles deployment automatically — you don’t need a CI/CD pipeline for deploys. But you might want to add API tests:

YAMLyaml
name: API Tests
on:
  deployment_status:

jobs:
  test:
    if: github.event.deployment_status.state == 'success'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run API tests
        run:
          npx @zuplo/cli test --endpoint ${{
          github.event.deployment_status.environment_url }}

The deployment itself is handled by Zuplo’s platform. Your pipeline only needs to run tests against the deployed preview.

Kong with decK

For Kong, you need to build the full sync pipeline:

YAMLyaml
name: Deploy Kong Config
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  diff:
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install decK
        run: |
          curl -sL https://github.com/kong/deck/releases/latest/download/deck_linux_amd64.tar.gz | tar xz
          sudo mv deck /usr/local/bin/

      - name: Show diff
        run: deck gateway diff kong.yaml
        env:
          DECK_KONG_ADDR: ${{ secrets.KONG_ADMIN_URL }}

  deploy:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install decK
        run: |
          curl -sL https://github.com/kong/deck/releases/latest/download/deck_linux_amd64.tar.gz | tar xz
          sudo mv deck /usr/local/bin/

      - name: Sync to Kong
        run: deck gateway sync kong.yaml
        env:
          DECK_KONG_ADDR: ${{ secrets.KONG_ADMIN_URL }}

This gives you a PR diff and automatic deployment on merge, but you are responsible for maintaining the pipeline, managing Kong admin credentials, and handling environment-specific configuration.

Rollback Patterns

How you roll back a bad deployment varies significantly across platforms, and the approach directly impacts your incident response time.

Git-Native Rollback (Zuplo)

Terminalbash
# Identify the bad commit
git log --oneline

# Revert it
git revert abc1234

# Push triggers automatic redeployment
git push origin main

The platform sees a new commit on main and deploys it. The “rollback” is just another deployment of the reverted state. This is the same workflow you’d use for any other change, which means there’s nothing special to learn or practice for incident response.

CLI Sync Rollback (Kong, Tyk)

Terminalbash
# Check out the previous known-good config
git checkout HEAD~1 -- kong.yaml

# Sync to the gateway
deck gateway sync kong.yaml

# Commit the rollback
git add kong.yaml
git commit -m "Rollback to previous configuration"
git push

This works, but it requires the operator to have the decK CLI installed, access to the Kong admin API, and knowledge of which commit was the last good state. In an incident, that’s more friction than a simple git revert.

IaC Rollback (AWS, Azure)

Terminalbash
# CloudFormation rollback
aws cloudformation rollback-stack --stack-name my-api-stack

# Or redeploy a previous template
git checkout HEAD~1 -- template.yaml
sam deploy --template-file template.yaml

IaC rollbacks interact with the cloud provider’s state management. A CloudFormation rollback might succeed, partially succeed, or get stuck in ROLLBACK_FAILED state. The rollback path is more complex than the deploy path, which is the opposite of what you want during an incident.

Apigee Rollback

Terminalbash
# Redeploy a previous revision
apigeecli apis deploy --name my-api --rev 5 --env prod --org my-org

Apigee tracks revisions natively, so you can point a deployment back to a previous revision number. This is relatively straightforward, but it requires knowing the correct revision number and having CLI access configured.

How to Choose

The right platform depends on your team’s existing stack and how far you want to take GitOps.

Choose a git-native platform (Zuplo) if:

  • You want GitOps without building CI/CD pipelines for gateway management
  • Branch preview environments are important to your workflow
  • Your team prefers to work in code editors and Git, not dashboards
  • You want the fastest possible path from code change to deployed API
  • You are building a new API program and don’t have legacy gateway commitments

Choose a declarative-config platform (Kong decK, Tyk) if:

  • You already run Kong or Tyk and want to add version control to existing config
  • Your team is comfortable building and maintaining CI/CD pipelines
  • You need the flexibility of self-hosted gateway infrastructure
  • Branch previews are not a hard requirement

Choose an IaC-integrated platform (AWS API Gateway, Azure APIM) if:

  • You’re already managing infrastructure with CloudFormation, CDK, or Bicep
  • Your APIs are tightly coupled to cloud-provider-specific services (Lambda, Azure Functions)
  • Your platform team manages API gateway config as part of broader infra-as-code
  • You’re comfortable with the complexity tradeoffs of IaC tooling

Consider the full picture:

GitOps maturity isn’t binary. Many teams start with a dashboard-driven workflow, move to storing config in Git, then add CI/CD sync, and eventually adopt a git-native platform. The platforms in this comparison support different points on that journey. The question is where you want to end up, and how much pipeline glue you want to maintain to get there.

Start Building with Git-Native API Management

If GitOps is how your team already works for application code, there’s no reason your API gateway should be the exception. Zuplo brings the same workflow — branches, pull requests, code review, merge-to-deploy — to API management without requiring you to build and maintain CI/CD pipelines for gateway sync.

Try Zuplo’s git-native API gateway at zuplo.com and see how config-as-code, automatic branch previews, and deploy-on-merge work in practice.

Further reading: