Sending data

Flowhawk speaks OpenTelemetry. Anything that exports OTLP works; the Flowhawk SDKs add business flows on top.

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 flows; the Flowhawk SDKs make the match exact and add flow-based sampling.

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

Flowhawk SDKs

Thin OpenTelemetry distributions for Node.js, Python, Go, Java and Kotlin, .NET, Ruby and PHP. Each one 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 public by design 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

Already use Sentry, or a language without a 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

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; 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.