---
title: "Observability — Anis Developers"
description: "What to record, what to alert on, and how to trace one purchase across your system and Anis."
url: https://developers.anis.ly/docs/observability/
language: en
---

> Every page of this documentation: https://developers.anis.ly/llms.txt

# Observability

## Two ids tie everything together

- **The request id** — every answer carries `X-Request-Id`, and every refusal repeats it as `requestId`. Log it with every call; it is what Anis needs to find your call.
- **The operation id** — the id you chose for an order. Log it at every step, from storing the intent to storing the codes. It traces one purchase across your system and Anis.

## What to alert on

| Signal | Why |
| --- | --- |
| **Orders whose outcome is unknown** — timeouts, lost connections, unverifiable answers, and refusals that may still complete | Each one must be resumed with the same operation id |
| **Answers that could not be verified** | Something between you and Anis changed an answer, a clock is badly out, or an Anis key rotation was missed. One short burst of unsigned `503`s is Anis’s own signing being briefly unavailable |
| **`invalid_credentials` on every call** | The key was revoked or replaced, or the clock drifted |
| **`rate_limited`** | Your traffic is near a limit Anis staff set |

## Never record

Your private key, signatures, signature bases, nonces, the enrolment token, or card codes (serials and vouchers) — anywhere: logs, traces, metrics or error reports.

## With the .NET SDK

The SDK reports everything under one name, `Anis.Partners.Sdk`, for traces and for metrics, and logs through your own logging:

```csharp
builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing.AddSource("Anis.Partners.Sdk"))
    .WithMetrics(metrics => metrics.AddMeter("Anis.Partners.Sdk"));
```

| Metric | What it tells you |
| --- | --- |
| `anis.partners.order.outcomes` | Orders by outcome: `completed`, `processing`, `replayed` — and `unknown`, the one to alert on |
| `anis.partners.request.duration` | Every call, by route and status or refusal code |
| `anis.partners.signature.duration` | Time spent signing — a slow vault shows here |
| `anis.partners.response.verification.failures` | Answers thrown away, by the rule that failed |
| `anis.partners.signing_keys.fetches` | Fetches of Anis’s public keys; a rising `refresh` means a rotation |

Each call’s trace carries the route, the request id and, on orders, the operation id. The SDK never records any of the secrets above — its tests check every log line, trace and metric for them.

> **Note**
>
> More in the [.NET SDK](https://developers.anis.ly/sdks/dotnet.md) page.
