Sending data

Anything that exports OpenTelemetry (OTLP) can send to Flowhawk. The Flowhawk SDKs also tag each request with its business flow.

Any OpenTelemetry SDK or collector

Export OTLP over HTTP (https://ingest.flowhawk.dev/v1/traces, /v1/logs, /v1/metrics) or gRPC (ingest.flowhawk.dev:443) with the header Authorization: Bearer <ingest key>. Set service.name on every service. Spans are matched to your business flows by service and route on our side, so this is enough to see your flows. The Flowhawk SDKs make the match exact and add sampling per flow.

Until the Flowhawk SDKs are published, the language guides walk through the setup for each language.

From an OpenTelemetry Collector, add an otlphttp exporter with endpoint: https://ingest.flowhawk.dev and the same header.

Flowhawk SDKs

These are small OpenTelemetry distributions for Node.js, Python, Go, Java and Kotlin, .NET, Ruby and PHP. They aren't on the public package registries yet, so the install lines below don't work today. Use the language guides until they are. Each SDK reads the same three settings:

FLOWHAWK_API_KEY=<ingest key>
FLOWHAWK_CONTROL_URL=https://api.flowhawk.dev
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.flowhawk.dev

Node.js

npm install @flowhawk/sdk-node
// first line of the entry file
require("@flowhawk/sdk-node").init({ service: "orders" });

Python

pip install flowhawk-sdk
import flowhawk_sdk
flowhawk_sdk.init(service="recommendations")  # before the web framework is imported

Go

go get github.com/Wimonder/flowhawk/packages/sdk-go
shutdown, err := flowhawk.Init(flowhawk.Options{Service: "payments"})
http.ListenAndServe(":8080", flowhawk.Middleware(mux))

Java and Kotlin

java -javaagent:opentelemetry-javaagent.jar \
  -Dotel.javaagent.extensions=flowhawk-sdk.jar -Dotel.service.name=orders -jar app.jar

The in-app Setup page shows the same steps with your workspace's addresses filled in. For jobs and queue consumers that no route matches, wrap the work in the SDK's withStep(flow, step, fn).

Browser

npm install @flowhawk/browser
import * as flowhawk from "@flowhawk/browser";
flowhawk.init({ service: "web", apiKey: "<browser key>", endpoint: "https://api.flowhawk.dev" });

Use a Browser key. It is meant to be public and can only send telemetry. The SDK records errors, page loads, web vitals and session replay (masked by the flow's collection policy) and links them to backend traces. Upload source maps from CI with an Upload key so stack traces show your source.

Sentry SDKs

If you already use Sentry, or your language has no Flowhawk SDK, keep the Sentry SDK and change its DSN:

SENTRY_DSN=https://<ingest key>@api.flowhawk.dev/1

Errors, transactions, and web and mobile replays arrive as the same data the Flowhawk SDKs send. Use a browser key in DSNs that ship to users (web and mobile apps).

Setup by your coding agent (MCP)

Flowhawk is an MCP server. Add it to Claude Code, Cursor or Codex and ask the agent to set Flowhawk up:

claude mcp add --transport http flowhawk https://api.flowhawk.dev/mcp
# then run /mcp in Claude Code and choose Authenticate

Coding agents and MCP covers other clients, keys for CI and what the agent may do.

The agent reads the install guide for each language from Flowhawk, adds the SDK, drafts the business map from your routes and opens a pull request. Your agent does the code work with your model budget, and you review the pull request and the proposed map.

What leaves your systems

SDKs and the collector redact common secrets and personal fields by default (for example user.email, card.number and the Authorization header) and never capture LLM prompts unless you turn it on. Add your own rules in Settings > Collection. See Your data and privacy.