Error codes · Keys and signatures
Malformed signed request
malformed_signed_requestAnisApiExceptionAn earlier copy of this order may have gone through
This request bought nothing, but it was refused before Anis looked at the order, so it says nothing about an earlier attempt with the same operation id. Fix the cause first (restore access, or fix how the request is signed), then resume the same id (or read it with GET /orders/{operationId}). Never place it again under a new id.
What it means
The signed request is badly built: a signature header is missing or cannot be read, the signed parts are not the ones this route needs or not in their order, or the Content-Digest cannot be read or does not describe the body that was sent. Anis decides this before it looks at any key, so it says nothing about your key.
What to do
- Run the signature self-check (check your signature) with the same signing code. If it is refused the same way, the fault is in how your code builds the signed request; if it passes, compare what it reports with the call that failed.
- Rebuild the request over the exact bytes you send: both
SignatureandSignature-Input(labelsig1), exactly the parts this route signs in their order (see Signing requests), and aContent-Digestof the body as sent — check that nothing between you and Anis changes the body. - Do not change your key: this refusal says nothing about it. Sending the same request again unchanged gets the same answer.
- On an order: refused before Anis looked at the order, so it says nothing about an earlier attempt with the same operation id. Fix how the request is signed first, then resume the same id (or read it with
GET /orders/{operationId}). Never place it again under a new id.
Where you can meet it
- GETRead your profile
/v1/profile - GETList wallets
/v1/wallets - GETRead a wallet
/v1/wallets/{walletId} - GETList catalogue categories
/v1/wallets/{walletId}/catalog/categories - GETList subcategories of a category
/v1/wallets/{walletId}/catalog/categories/{categoryId}/subcategories - GETRead a subcategory
/v1/wallets/{walletId}/catalog/subcategories/{subcategoryId} - GETList cards for sale
/v1/wallets/{walletId}/catalog/subcategories/{subcategoryId}/cards - GETRead a catalogue card
/v1/wallets/{walletId}/catalog/cards/{cardId} - POSTPlace an order
/v1/wallets/{walletId}/orders - GETRead an order
/v1/orders/{operationId} - GETList owned cards
/v1/wallets/{walletId}/owned-cards - GETRead an owned card
/v1/wallets/{walletId}/owned-cards/{soldCardId} - POSTReveal a card
/v1/wallets/{walletId}/owned-cards/{soldCardId}/reveal - POSTReveal an invoice
/v1/wallets/{walletId}/invoices/{invoiceId}/owned-cards/reveal - POSTSuspend your application
/v1/application/suspend - POSTRevoke an application key
/v1/keys/{keyId}/revoke - POSTCheck your signature
/v1/diagnostics/signature - GETList your allowed addresses
/v1/application/networks - POSTAllow one more address
/v1/application/networks - POSTRemove an address you added
/v1/application/networks/remove - GETGet meter packages
/v1/wallets/{walletId}/meter-packages - GETGet my meter charges
/v1/wallets/{walletId}/meter-charges - POSTCharge a meter
/v1/wallets/{walletId}/meter-charges - GETRead a meter charge
/v1/meter-charges/{operationId} - GETGet direct recharge products
/v1/wallets/{walletId}/direct-recharge-products - GETRead a direct recharge product
/v1/wallets/{walletId}/direct-recharge-products/{productId} - GETGet recipient locations
/v1/wallets/{walletId}/direct-recharge-products/{productId}/locations - GETQuote a direct recharge product
/v1/wallets/{walletId}/direct-recharge-products/{productId}/quote - GETGet my direct recharges
/v1/wallets/{walletId}/direct-recharges - POSTRequest a direct recharge product
/v1/wallets/{walletId}/direct-recharges - GETRead a direct recharge
/v1/direct-recharges/{operationId} - PATCHCorrect a suspended recipient
/v1/direct-recharges/{operationId}/recipient - GETRead your webhook endpoint
/v1/webhook-endpoint - PUTSet your webhook endpoint
/v1/webhook-endpoint - POSTTest your webhook endpoint
/v1/webhook-endpoint/test - GETGet webhook deliveries
/v1/webhook-events - POSTRedeliver a webhook
/v1/webhook-events/{eventId}/redeliver
Example
The body of the refusal. Its type is the address of this page.
{
"type": "https://developers.anis.ly/errors/malformed-signed-request",
"title": "Malformed signed request",
"status": 400,
"code": "malformed_signed_request",
"requestId": "01J9R2K8T4V6XQ0M3B7C5D9E1F"
}