---
title: "Check your signature — Anis Developers"
description: "The signature self-check: runs your call through Anis’s full checks and reports exactly what Anis saw — the method, address, path and query it signed over, the key it found and the permissions in force. It changes nothing. Sends exactly `{}`."
url: https://developers.anis.ly/reference/check-signature/
language: en
---

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

[API reference](https://developers.anis.ly/reference.md) · Diagnostics

# Check your signature

`POST /v1/diagnostics/signature`

The signature self-check: runs your call through Anis’s full checks and reports exactly what Anis saw — the method, address, path and query it signed over, the key it found and the permissions in force. It changes nothing. Sends exactly `{}`.

- **Permission:** `diagnostics:use`
- **Authentication:** Signed change
- **Staff-set limits it counts toward:** All requests
- **.NET SDK:** `anis.Diagnostics.CheckSignatureAsync()`

- The right first call when a signature will not verify.

## Request

Signed with your key, with a one-time nonce and a digest of the body.

Headers: `Signature-Input`, `Signature`, `Content-Digest`, `Nonce`, `X-Anis-Date`. The SDKs set all of them for you.

**Body:** Exactly the two bytes `{}` — nothing else.

## Responses

| Status | Meaning | Body |
| --- | --- | --- |
| 200 | Success. | [SignatureDiagnostic](#type-signaturediagnostic) |
| 401 | Refused: not authenticated. | [Problem](#refusals) |
| 403 | Refused: not allowed. | [Problem](#refusals) |
| 409 | Refused: conflicts with the current state. | [Problem](#refusals) |
| 422 | Refused: the request breaks a rule. | [Problem](#refusals) |
| 429 | Refused: a limit was reached. | [Problem](#refusals) |

Every answer is signed by Anis; the SDKs check it before you see it.

## Refusals

Every refusal is a signed problem. Branch on its `code`; each links to what it means and what to do.

| Error | Code | Status |
| --- | --- | --- |
| [Invalid credentials](https://developers.anis.ly/errors/invalid-credentials.md) | `invalid_credentials` | 401 |
| [Insufficient scope](https://developers.anis.ly/errors/insufficient-scope.md) | `insufficient_scope` | 403 |
| [Source address not allowed](https://developers.anis.ly/errors/source-ip-not-allowed.md) | `source_ip_not_allowed` | 403 |
| [Rate limited](https://developers.anis.ly/errors/rate-limited.md) | `rate_limited` | 429 |
| [Replay detected](https://developers.anis.ly/errors/replay-detected.md) | `replay_detected` | 409 |
| [Validation failed](https://developers.anis.ly/errors/validation-failed.md) | `validation_failed` | 422 |
| [Internal error](https://developers.anis.ly/errors/internal-error.md) | `internal_error` | 500 |
| [Request timeout](https://developers.anis.ly/errors/request-timeout.md) | `request_timeout` | 504 |

## Types

### SignatureDiagnostic

| Field | Type | Notes |
| --- | --- | --- |
| `routeId` (required) | string | The route Anis matched your call to. |
| `method` (required) | string | The method, as Anis saw it. |
| `authority` (required) | string | The host (and port, if not the default), as Anis saw it — lower-cased. |
| `path` (required) | string | The path, as Anis saw it. |
| `canonicalQuery` (required) | string | The query, as Anis saw it, without its leading `?`. |
| `requestKind` (required) | string | How Anis expects this route to be signed. Values: `safeRead`, `bodylessNonceMutation`, `orderMutation`, `enrollmentToken`, `public` |
| `requiredScope` (required) | string | The permission this route needs. |
| `coveredComponents` (required) | list of string | The signed components this route requires, in order. |
| `keyId` (required) | UUID | The key id Anis found your signature under. |
| `partnerId` (required) | UUID | The partner that key belongs to. |
| `applicationId` (required) | UUID | The application that key belongs to. |
| `policyVersion` (required) | integer | The version of your application’s permissions that applied. It goes up each time Anis staff change them. |
| `effectiveScopes` (required) | list of string | The permissions in force for this call. |
| `receivedAt` (required) | string (date-time) | When Anis received the call. |
