Skip to main content

starlette-request-id

Request-ID context and response propagation middleware for Starlette applications.

Requirements

  • Python 3.11+ (CI validates 3.11, 3.12, 3.13, and 3.14)
  • Starlette >1.2.0 and <2.0.0

Install

uv add starlette-request-id
pip install starlette-request-id

Basic usage

from starlette.applications import Starlette

from starlette_request_id import RequestIdMiddleware

app = Starlette()
app.add_middleware(RequestIdMiddleware)

RequestIdMiddleware reads x-request-id, creates a UUID4 ID if it is absent, exposes it through request_id_ctx, and writes the active value to the response header. See examples/basic_usage.py for logging and outbound-header propagation.

Examples

Run the standalone example:

uv run --with uvicorn examples/basic_usage.py

Run the dedicated Uvicorn example:

uv run --with 'uvicorn[standard]' uvicorn examples.uvicorn_runner:app --reload

Run the Gunicorn example with Uvicorn workers:

uv run --with gunicorn --with uvicorn gunicorn -c examples/gunicorn_conf.py examples.gunicorn_runner:app

Then send a request with a chosen ID:

curl -H 'x-request-id: example-id' http://127.0.0.1:8000/

Starlette 1.3 uses app.add_route(path, endpoint) to register handlers; the examples follow that API.

Configuration

app.add_middleware(
    RequestIdMiddleware,
    id_header="x-correlation-id",
    get_default_id_func=lambda: "generated-id",
)

A supplied value is preserved exactly; the generator is called only when the header is absent.

Logging

from starlette_request_id import init_logger, request_id_ctx

These exports are the shared APIs from request-id-helper, so applications that import request_id_ctx directly from request_id_helper observe the same request value.

Error responses and middleware order

The middleware adds the header to response starts emitted by the application and its inner exception handlers. It does not render exceptions. If an outer error middleware constructs a response after an exception escapes RequestIdMiddleware, put that error middleware inside RequestIdMiddleware or make it write the request-ID header itself.

Migrating from 1.x

2.0.0 drops Python 3.8–3.10 and replaces the internal BaseHTTPMiddleware implementation with pure ASGI middleware. Existing imports of RequestIdMiddleware, REQUEST_ID_HEADER, request_id_ctx, init_logger, and LogExtraFactory continue to work. Update deployment environments to Python 3.11+, use Starlette's add_route() API, and retain request-id-helper as the shared logging/context provider.

Development

uv sync --all-groups
make lint
make test
make build

License

starlette-request-id is distributed under the Apache License 2.0.

Release files for starlette-request-id 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for starlette-request-id 2.0.0
File Size Uploaded
starlette_request_id-2.0.0.tar.gz 47.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for starlette-request-id 2.0.0
File Interpreter ABI Platform
starlette_request_id-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 56.0 kB

Release files / starlette_request_id-2.0.0.tar.gz

Download URL starlette_request_id-2.0.0.tar.gz
Size 47.8 kB
Tags Source
SHA-256 checksum
How to use checksums
7a7d8856a77f2c73fdf7feaace1985db5ef397ca7ba6d8bb54cc9f5336c03f63
BLAKE2b-256 checksum
How to use checksums
eb8c4ab9e80f9e71f3ddd869ca85aad9b8b34f722d79b0d64889662d9c3563ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 20, 2026.

Transparency log

Release files / starlette_request_id-2.0.0-py3-none-any.whl

Download URL starlette_request_id-2.0.0-py3-none-any.whl
Size 8.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a3870603280d40995f95112a3088579951553ffbf3eba7984df250a4f8c116bc
BLAKE2b-256 checksum
How to use checksums
868c26999c59b4432d74afce828f2dcad1a26992a987e4f1d1f7dbfa372f3e70
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 20, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page