Free while in preview · 10,000 spans included

Know exactly which link broke in your business process

Your checkout, onboarding, or billing run touches half a dozen services you don't control. When one of them fails, the whole process fails — and nobody can say where. Axis records every step of the chain and shows you the run as one datamap — the whole process in a single picture.

No credit card. Send your first span in about five minutes.

execution · order-8412failed at charge_payment
receive_ordersuccess · 38 msvalidate_stocksuccess · 121 mscharge_paymentfailed · 502 · 1.9 sreserve_shippingnever ransend_confirmationnever ran2 steps never ran — the definition expected 5

Features

Process-level observability, not another log firehose

APM tells you a service is slow. Logs tell you a request happened. Neither draws you the map of the process itself — or tells you that step four of five silently stopped running last Tuesday.

Correlation, not log spelunking

Every step you record carries a shared correlation id. The correlation engine assembles them into one process execution — ordered, timed, and complete — instead of five services' worth of logs you have to join by hand.

Every run, as a datamap

One interactive map per process run: a node per step, green for success, red for failure, edges showing what triggered what. The broken link is the red one — no reading required.

Completeness checks

Optionally declare the shape a process is supposed to have. Strict mode then flags what logs can't: steps that failed, ran out of order, or never ran at all — the silent failures nobody alerts on.

Ask questions without SQL

Filter executions and spans by step, status, duration, or any attribute you attached, with a visual query builder. Filtering runs server-side, so it works the same on ten spans or ten million.

Projects, keys, and quotas

Separate projects per product or environment, each with its own scoped API keys — hashed at rest and shown exactly once — plus a transparent credit balance: one credit, one ingested span.

Built to be trusted with the data

Ingestion is at-least-once and idempotent, so a retry can't double-count. Spans are immutable once written. Every tenant query is scoped, and the platform's own errors are tracked out-of-band, never in your request path.

On the roadmap: gateway mode — route a call through Axis and the step is recorded firsthand, no instrumentation in your code at all. Today's collection is passive, and both modes produce identical spans by design.

How it works

Three steps from blind spot to answer

No agents to deploy, no sidecars, no sampling decisions. Your services keep calling whatever they call — they just tell us about it.

01

Instrument each step

Wrap the calls a process depends on — a payment API, an MCP server, a mail generator, a cron job — with the SDK, or POST the same span from any language over plain HTTP. One shared trace id per process run is the only thing they need in common.

02

We correlate the run

Spans arrive independently, from whichever service produced them, in whatever order. They land in a queue, get persisted idempotently, and are assembled into a single execution with per-step status and timing.

03

See which link broke

Open the run's datamap and read it at a glance — graph or waterfall — filter across runs to spot the pattern, and, if you declared the topology, let strict mode point at the step that never ran.

Instrumentation

A context manager, or one HTTP call

Use the Python SDK where you can, and the ingestion API everywhere else — the same span shape, from any language or runtime that can make a request.

Python SDK
from tracer_sdk import Tracer

client = Tracer(api_key="trk_...")

# One trace = one run of your business process.
with client.trace(order_id) as trace:
    with trace.span("validate_stock"):
        warehouse.reserve(order_id)

    # If this raises, the span is recorded as failed — automatically.
    with trace.span("charge_payment") as span:
        span.set("amount_cents", 4200)
        payments.charge(order_id)

    with trace.span("send_confirmation"):
        mailer.send(order_id)
Any language — ingestion API
curl -X POST https://<your-host>/v1/spans \
  -H "Authorization: Bearer trk_..." \
  -H "Content-Type: application/json" \
  -d '[{
        "trace_id": "order-8412",
        "step_name": "charge_payment",
        "status": "failed",
        "start_time": "2026-08-19T10:00:00Z",
        "end_time":   "2026-08-19T10:00:01.9Z",
        "attributes": {"provider": "stripe", "http_status": 502}
      }]'

Failures are recorded automatically when the block raises — you never write the error-handling branch. Full reference in the docs.

Pricing

Free while we're in preview

Metering is already built and visible in the dashboard, so there are no surprises later: one credit is one ingested span, and you can watch the balance.

Preview access

Free

10,000 spans on the house, per project

  • 10,000 spans included when you create a project
  • Unlimited projects, endpoints, and process definitions
  • The full dashboard: graph, waterfall, filters, completeness checks
  • Python SDK and the language-agnostic HTTP ingestion API
  • One credit per ingested span — no per-seat pricing, no sampling
Create your project

Need more while you evaluate? Ask on the feedback board and we'll top you up.

Axis