Contents

POST /aml/$OFFICER_PUB/decision#

Make an AML decision. Triggers the respective action and records the justification.

Request:

The request must be an AmlDecisionRequest message.

Response

204 No content:

The AML decision has been executed and recorded successfully.

400 Bad request:

The request was malformed. This response comes with a standard ErrorDetail response with a code of TALER_EC_GENERIC_PARAMETER_MALFORMED.

403 Forbidden:

The signature is invalid (or the AML officer not known). Returned with an error code of TALER_EC_EXCHANGE_AML_DECISION_ADD_SIGNATURE_INVALID or TALER_EC_EXCHANGE_GENERIC_AML_OFFICER_ACCESS_DENIED.

404 Not found:

The normalized payto-address the decision was made for is unknown to the exchange. Returned with an error code of: TALER_EC_EXCHANGE_GENERIC_BANK_ACCOUNT_UNKNOWN

409 Conflict:

The designated AML account is not enabled or a more recent decision was already submitted. Returned with an error code of:

  • TALER_EC_EXCHANGE_AML_DECISION_MORE_RECENT_PRESENT or

  • TALER_EC_EXCHANGE_AML_DECISION_INVALID_OFFICER

413 Request entity too large:

The uploaded body is to long, it exceeds the size limit. Returned with an error code of TALER_EC_GENERIC_UPLOAD_EXCEEDS_LIMIT.

500 Internal server error:

The server had an internal error processing the request. Returned with one of various error codes, including:

  • TALER_EC_EXCHANGE_KYC_GENERIC_AML_LOGIC_BUG

  • TALER_EC_GENERIC_DB_STORE_FAILED

  • TALER_EC_EXCHANGE_KYC_RECURSIVE_RULE_DETECTED

  • TALER_EC_GENERIC_DB_FETCH_FAILED

  • TALER_EC_GENERIC_DB_COMMIT_FAILED

  • TALER_EC_EXCHANGE_KYC_AML_PROGRAM_FAILURE

  • TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE

  • TALER_EC_EXCHANGE_GENERIC_KYC_FALLBACK_FAILED

  • TALER_EC_EXCHANGE_KYC_AML_PROGRAM_MALFORMED_RESULT

  • TALER_EC_EXCHANGE_GENERIC_KYC_FALLBACK_UNKNOWN

Details:

interface AmlDecisionRequest {

  // Human-readable justification for the decision.
  justification: string;

  // Hash of normalized payto-address of the account the decision is about.
  // Identifies a GNU Taler wallet or an affected bank account.
  h_payto: NormalizedPaytoHash;

  // Full payto address of the account the decision is about.
  // Optional. Must be given if the account is not yet
  // known to the exchange. If given, must match h_payto
  // (when normalized and then hashed).
  // @since protocol **v21**.
  payto_uri?: string;

  // What are the new rules?
  // New since protocol **v20**.
  new_rules: LegitimizationRuleSet;

  // What are the new account properties?
  // New since protocol **v20**.
  properties?: AccountProperties;

  // Array of AML/KYC events to trigger for statistics.
  // Note that this information is not covered by the signature
  // (which is OK as events are just for statistics).
  // New since protocol **v24**.
  events?: string[];

  // Space-separated list of measures to trigger
  // immediately on the account.
  // Prefixed with a "+" to indicate that the
  // measures should be ANDed.
  // Should typically be used to give the user some
  // information or request additional information.
  //
  // At most one measure with a SKIP check may be specified.
  //
  // @since protocol **v21**.
  new_measures?: string;

  // True if the account should remain under investigation by AML staff.
  // @since protocol **v20**.
  keep_investigating: boolean;

  // Signature by the AML officer over a TALER_AmlDecisionPS.
  // Must have purpose TALER_SIGNATURE_MASTER_AML_KEY.
  officer_sig: EddsaSignature;

  // When was the decision made?
  decision_time: Timestamp;

  // KYC attributes uploaded by the AML officer
  // The object *must* contain high-entropy salt,
  // as the hash of the attributes will be
  // stored in plain text.
  attributes?: CustomerKycAttributes;

  // Expiration timestamp of the attributes.
  // Mandatory if attributes are present.
  attributes_expiration?: Timestamp;

}