---
title: "Invalid credentials — Anis Developers"
description: "Anis could not authenticate the call: the key id is unknown, the key is not active (not yet confirmed, revoked or expired), the signature does not match the request, the signature is too old or signed on a clock that is out, or the body does not match its `Content-Digest`. All of these get this same answer on purpose, so a refusal never tells anyone which one to work around."
url: https://developers.anis.ly/errors/invalid-credentials/
language: en
---

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

[Error codes](https://developers.anis.ly/errors.md) · Keys and signatures

# Invalid credentials

- **Code:** `invalid_credentials`
- **Status:** 401
- **If this was an order:** This request bought nothing
- **Send it again unchanged?** No — change something first
- **.NET SDK:** `InvalidCredentialsException`

## What it means

Anis could not authenticate the call: the key id is unknown, the key is not active (not yet confirmed, revoked or expired), the signature does not match the request, the signature is too old or signed on a clock that is out, or the body does not match its `Content-Digest`. All of these get this same answer on purpose, so a refusal never tells anyone which one to work around.

## What to do

- Check that the key id and the private key you sign with belong together.
- Check that the key is active: the enrolment status reports `active` once Anis staff confirm it.
- Check your server clock, and sign each attempt afresh — never reuse an old signature.
- Compute the `Content-Digest` over the exact bytes you send.
- Run the signature self-check: it reports exactly what Anis saw. If the self-check is refused too, the key itself is the problem.

## Where you can meet it

- GET [Read your profile](https://developers.anis.ly/reference/read-profile.md) `/v1/profile`
- GET [List wallets](https://developers.anis.ly/reference/list-wallets.md) `/v1/wallets`
- GET [Read a wallet](https://developers.anis.ly/reference/read-wallet.md) `/v1/wallets/{walletId}`
- GET [List catalogue categories](https://developers.anis.ly/reference/list-categories.md) `/v1/wallets/{walletId}/catalog/categories`
- GET [List subcategories of a category](https://developers.anis.ly/reference/list-subcategories.md) `/v1/wallets/{walletId}/catalog/categories/{categoryId}/subcategories`
- GET [Read a subcategory](https://developers.anis.ly/reference/read-subcategory.md) `/v1/wallets/{walletId}/catalog/subcategories/{subcategoryId}`
- GET [List cards for sale](https://developers.anis.ly/reference/list-cards.md) `/v1/wallets/{walletId}/catalog/subcategories/{subcategoryId}/cards`
- POST [Place an order](https://developers.anis.ly/reference/create-order.md) `/v1/wallets/{walletId}/orders`
- GET [Read an order](https://developers.anis.ly/reference/read-order.md) `/v1/orders/{operationId}`
- GET [List owned cards](https://developers.anis.ly/reference/list-owned-cards.md) `/v1/wallets/{walletId}/cards`
- GET [Read an owned card](https://developers.anis.ly/reference/read-owned-card.md) `/v1/wallets/{walletId}/cards/{soldCardId}`
- POST [Reveal a card](https://developers.anis.ly/reference/reveal-card.md) `/v1/wallets/{walletId}/cards/{soldCardId}/reveal`
- POST [Reveal an invoice](https://developers.anis.ly/reference/reveal-invoice.md) `/v1/wallets/{walletId}/invoices/{invoiceId}/cards/reveal`
- POST [Check your signature](https://developers.anis.ly/reference/check-signature.md) `/v1/diagnostics/signature`

## Example

The body of the refusal. Its `type` is the address of this page.

```
{
  "type": "https://developers.anis.ly/errors/invalid-credentials",
  "title": "Invalid credentials",
  "status": 401,
  "code": "invalid_credentials",
  "requestId": "01J9R2K8T4V6XQ0M3B7C5D9E1F"
}
```
