Errors

When a call fails, Notabene answers with an HTTP status and a JSON body that says what to correct.

The two shapes of an error

Most errors are a problem document: a status, a short title and a detail with the reason. A request that fails validation lists each problem under errors instead, with the field when it can name one.

JSONJSON
{
  "title": "Unauthorized",
  "status": 401,
  "detail": "unauthorized"
}
{
  "errors": [
    {
      "field": "ref",
      "error": "INVALID_VALUE",
      "message": "ref must be a UUID"
    }
  ]
}
{
  "title": "Unauthorized",
  "status": 401,
  "detail": "unauthorized"
}
{
  "errors": [
    {
      "field": "ref",
      "error": "INVALID_VALUE",
      "message": "ref must be a UUID"
    }
  ]
}

In a validation error, error is one of MISSING_REQUIRED_FIELD, INVALID_VALUE or INVALID_REQUEST, and message gives the reason.

HTTP statuses

StatusWhat it meansWhat to do
400The request is invalid: a field is missing or malformed, or the call does not apply to the transfer as it is.Correct the request. Sending it again unchanged gives the same answer.
401The access token is missing, malformed or expired.Request a new token, as described in Authentication.
403The token is valid but cannot make this call.Use a token with the permission the message names.
404What the call looks for does not exist, or is not yours to see.Check the id or address.
409The request conflicts with what already exists, such as a ref used for another transfer.Read the message. Some conflicts clear if you send the request again.
429Too many requests: more than 6,000 calls in 300 seconds. Every endpoint then refuses your calls for 10 seconds.Wait, then send the request again, as Rate limiting shows.
500 and aboveNotabene could not complete the call.Send the request again after a pause.
StatusWhat it meansWhat to do
400The request is invalid: a field is missing or malformed, or the call does not apply to the transfer as it is.Correct the request. Sending it again unchanged gives the same answer.
401The access token is missing, malformed or expired.Request a new token, as described in Authentication.
403The token is valid but cannot make this call.Use a token with the permission the message names.
404What the call looks for does not exist, or is not yours to see.Check the id or address.
409The request conflicts with what already exists, such as a ref used for another transfer.Read the message. Some conflicts clear if you send the request again.
429Too many requests: more than 6,000 calls in 300 seconds. Every endpoint then refuses your calls for 10 seconds.Wait, then send the request again, as Rate limiting shows.
500 and aboveNotabene could not complete the call.Send the request again after a pause.

Messages you may see

AnswerFromWhat to do
400 with expected required property amount to be presentPOST/api/v1/transfersAdd the missing field. The message names it.
400 with ref must be a UUIDPOST/api/v1/transfersSend a UUID of yours as ref.
400 with originator or originator_id is requiredPOST/api/v1/transfersName your customer who sends the funds, or for a deposit, the sending institution or your own DID.
400 with beneficiary_entity_did or settlement_address is requiredPOST/api/v1/transfersSend the destination address.
400 with is not a valid eip155 address or bip122 addressPOST/api/v1/transfersSend the address as CAIP-10, or as a bare address on the asset’s chain.
400 with invalid amountPOST/api/v1/transfersSend the amount as a string in the asset’s whole units, such as "0.5".
400 with invalid beneficiary_entity_didPOST/api/v1/transfersSend the DID of the counterparty institution, or leave the field out.
400 with field exceeds its maximum lengthPOST/api/v1/transfersA name part is longer than 100 characters. Shorten it.
400 with unknown asset symbolPOST/api/v1/transfersUse an asset from Assets.
400 with expected required property reason to be presentPOST/api/v1/transfers/{id}/force-authorizeGive a reason.
400 with cannot force-authorize a concluded txPOST/api/v1/transfers/{id}/force-authorizeThe transfer is already Settled or Rejected. There is nothing to approve.
401 with unauthorizedAny callSend the token in the Authorization header.
401 with invalid bearer tokenAny callThe token is malformed, expired or revoked. Request a new one.
403 with missing required scopesAny callThe token lacks the permission the message names.
403 with token subject does not match customerCalls under /api/v1/customers/{customer_ref}/A delegate token was used for another customer.
404 with address owner not foundPOST/api/v1/wallet-ownerships/discoverNo institution registered the address. Ask your customer who sent the funds.
409 with a transfer with this ref already exists with different contentPOST/api/v1/transfersA transfer with this ref exists. Sending a create again says what it means.
409 with transfer already settled with a different settlement idPOST/api/v1/transfers/{id}/settleThe transfer already has a hash. Check which one is right.
409 on approvePOST/api/v1/transfers/{id}/force-authorizeThe transfer changed while it was being approved. Send the request again.
AnswerFromWhat to do
400 with expected required property amount to be presentPOST /api/v1/transfersAdd the missing field. The message names it.
400 with ref must be a UUIDPOST /api/v1/transfersSend a UUID of yours as ref.
400 with originator or originator_id is requiredPOST /api/v1/transfersName your customer who sends the funds, or for a deposit, the sending institution or your own DID.
400 with beneficiary_entity_did or settlement_address is requiredPOST /api/v1/transfersSend the destination address.
400 with is not a valid eip155 address or bip122 addressPOST /api/v1/transfersSend the address as CAIP-10, or as a bare address on the asset’s chain.
400 with invalid amountPOST /api/v1/transfersSend the amount as a string in the asset’s whole units, such as "0.5".
400 with invalid beneficiary_entity_didPOST /api/v1/transfersSend the DID of the counterparty institution, or leave the field out.
400 with field exceeds its maximum lengthPOST /api/v1/transfersA name part is longer than 100 characters. Shorten it.
400 with unknown asset symbolPOST /api/v1/transfersUse an asset from Assets.
400 with expected required property reason to be presentPOST /api/v1/transfers/{id}/force-authorizeGive a reason.
400 with cannot force-authorize a concluded txPOST /api/v1/transfers/{id}/force-authorizeThe transfer is already Settled or Rejected. There is nothing to approve.
401 with unauthorizedAny callSend the token in the Authorization header.
401 with invalid bearer tokenAny callThe token is malformed, expired or revoked. Request a new one.
403 with missing required scopesAny callThe token lacks the permission the message names.
403 with token subject does not match customerCalls under /api/v1/customers/{customer_ref}/A delegate token was used for another customer.
404 with address owner not foundPOST /api/v1/wallet-ownerships/discoverNo institution registered the address. Ask your customer who sent the funds.
409 with a transfer with this ref already exists with different contentPOST /api/v1/transfersA transfer with this ref exists. Sending a create again says what it means.
409 with transfer already settled with a different settlement idPOST /api/v1/transfers/{id}/settleThe transfer already has a hash. Check which one is right.
409 on approvePOST /api/v1/transfers/{id}/force-authorizeThe transfer changed while it was being approved. Send the request again.

Sending a request again

You can send a request again when it failed with a 5xx or a 429, or got no answer at all. Wait longer before each attempt, for example 1, 2 and then 4 seconds, as Rate limiting shows.

Sending a create again

Creating a transfer is safe to retry because Notabene never creates two transfers with the same ref. What Notabene answers depends on what you send the second time.

You sendNotabene answersWhat it means
The same request, with the same ref201 with the same transfer, or 409 with a transfer with this ref already exists with different contentYour first request created the transfer. Find it by ref in its transfer.created.v3 event.
Other content, with a ref you used before409 with the same messageThe ref belongs to another transfer. Give this one a new UUID.
A new ref201 with a new transferA second transfer. Use a new ref only for a new transfer.
You sendNotabene answersWhat it means
The same request, with the same ref201 with the same transfer, or 409 with a transfer with this ref already exists with different contentYour first request created the transfer. Find it by ref in its transfer.created.v3 event.
Other content, with a ref you used before409 with the same messageThe ref belongs to another transfer. Give this one a new UUID.
A new ref201 with a new transferA second transfer. Use a new ref only for a new transfer.

Recording the same hash on a transfer again answers 200. For any other 4xx, apart from a 409 on approve and a 429, correct the request before you send it again.

When you contact support

Write to [email protected] with the transfer id, the call, the time it was made, and the status and body of the response. A request id to quote is still to be published. (placeholder)


Did this page help you?