Skip to content

httptape

Record, Redact, Replay -- HTTP traffic recording, redaction, and replay.

httptape captures HTTP request/response pairs, redacts sensitive data on write, and replays them as a mock server. It ships as an embeddable Go library, a standalone CLI, and a minimal Docker image.

The 3 Rs

  1. Record -- wrap any http.RoundTripper to capture real HTTP traffic, or use the CLI/Docker to record from an upstream API
  2. Redact -- strip secrets, PII, and credentials on write via a configurable redaction pipeline, before anything touches disk
  3. Replay -- serve recorded fixtures as a deterministic mock http.Handler, or run a standalone mock server via CLI/Docker

Why httptape?

Standalone server + CLI, sanitize-on-write by default, SSE event-level replay, and embeddable as a Go library with zero deps. For the full story (extracted from VibeWarden's egress proxy) and side-by-side comparisons with WireMock, Hoverfly, go-vcr, and others, see Why httptape.

Key features

  • Record -- wrap any http.RoundTripper to capture real HTTP traffic
  • Redact on write -- strip headers, body fields, or replace values with deterministic fakes before storage
  • Replay -- serve recorded fixtures as a mock http.Handler
  • Proxy with fallback -- forward to upstream with automatic fallback to cached responses when the backend is down
  • Composable matching -- match requests by method, path, query params, headers, body hash, or fuzzy body fields
  • Pluggable storage -- in-memory for tests, filesystem for fixtures, or implement your own Store
  • Import/export -- share fixture bundles as tar.gz archives between environments
  • Zero dependencies -- stdlib only, no transitive deps for embedders
  • CLI and Docker -- use as a standalone proxy for recording, replaying, and caching

Install

go get github.com/httptape/httptape
go install github.com/httptape/httptape/cmd/httptape@latest
docker pull ghcr.io/httptape/httptape:latest

Requires Go 1.26 or later for the library/CLI. Docker works with any platform.

Quick example

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"

    "github.com/httptape/httptape"
)

func main() {
    store := httptape.NewMemoryStore()

    // Record
    rec := httptape.NewRecorder(store, httptape.WithRoute("github"))
    client := &http.Client{Transport: rec}
    client.Get("https://api.github.com/users/octocat")
    rec.Close()

    // Replay
    srv := httptape.NewServer(store)
    ts := httptest.NewServer(srv)
    defer ts.Close()

    resp, _ := http.Get(ts.URL + "/users/octocat")
    fmt.Println(resp.StatusCode) // 200
}

Or using the CLI:

# Record from a real API (with redaction)
httptape record --upstream https://api.github.com --fixtures ./mocks --config redact.json

# Replay as a mock server
httptape serve --fixtures ./mocks --port 8081

# Proxy with automatic fallback
httptape proxy --upstream https://api.github.com --fixtures ./cache

Documentation

Page Description
Getting Started Record, redact, and replay in 5 minutes
Recording Recorder options, async/sync, sampling, body limits
Replay Server options, fallback behavior, request handling
Redaction RedactHeaders, RedactBodyPaths, FakeFields, Pipeline
Proxy Mode L1/L2 caching, fallback behavior, frontend dev
Matching All matchers, CompositeMatcher, score weights, declarative config
Storage MemoryStore, FileStore, custom Store implementations
Import/Export ExportBundle, ImportBundle, selective filters
Config Declarative JSON configuration for redaction and matcher composition
CLI serve, record, proxy, export, import commands
Docker Container usage, docker-compose, volumes
Testcontainers Go Testcontainers module for integration tests
API Reference All exported types, functions, and options

License

Apache 2.0