gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant] branch master updated: store user-type with merchant se


From: gnunet
Subject: [taler-merchant] branch master updated: store user-type with merchant settings
Date: Tue, 11 Apr 2023 19:44:54 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 5ed3b2cf store user-type with merchant settings
5ed3b2cf is described below

commit 5ed3b2cfe1aa0cb31c589b308cc70684a20dd368
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Apr 11 19:44:51 2023 +0200

    store user-type with merchant settings
---
 src/backend/Makefile.am                            |   3 +-
 ...r-merchant-httpd_private-get-instances-ID-kyc.c |   3 +-
 ...taler-merchant-httpd_private-get-instances-ID.c |   5 +-
 .../taler-merchant-httpd_private-get-instances.c   |   5 +-
 ...ler-merchant-httpd_private-patch-instances-ID.c |  23 +-
 .../taler-merchant-httpd_private-post-instances.c  |  21 +-
 src/backenddb/Makefile.am                          |   4 +-
 src/backenddb/drop.sql                             |   2 +-
 src/backenddb/plugin_merchantdb_postgres.c         |  16 +-
 src/include/taler_merchant_service.h               | 173 ++++++++--
 src/include/taler_merchantdb_plugin.h              |   1 -
 src/lib/Makefile.am                                |   1 +
 src/lib/merchant_api_get_instance.c                | 109 ++++---
 src/lib/merchant_api_get_instances.c               |  74 +++--
 src/lib/merchant_api_get_products.c                |  52 +--
 src/lib/merchant_api_patch_instance.c              |  11 +
 src/lib/merchant_api_post_instances.c              |  13 +-
 src/testing/test_key_rotation.sh                   |   2 +-
 src/testing/test_merchant_api.c                    |  19 +-
 src/testing/test_merchant_instance_auth.sh         |   2 +-
 src/testing/test_merchant_instance_creation.sh     |   2 +-
 src/testing/test_merchant_instance_purge.sh        |   2 +-
 src/testing/test_merchant_instance_response.sh     |   2 +-
 src/testing/test_merchant_kyc.sh                   |   2 +-
 src/testing/test_merchant_order_autocleanup.sh     |   4 +-
 src/testing/test_merchant_order_creation.sh        |   4 +-
 src/testing/test_merchant_product_creation.sh      |   2 +-
 src/testing/test_merchant_reserve_creation.sh      |   2 +-
 src/testing/test_merchant_transfer_tracking.sh     |   4 +-
 src/testing/testing_api_cmd_get_instance.c         | 354 +++++++++++----------
 src/testing/testing_api_cmd_get_instances.c        | 116 +++----
 src/testing/testing_api_cmd_get_products.c         |  76 ++---
 src/testing/testing_api_cmd_patch_instance.c       |   1 +
 src/testing/testing_api_cmd_post_instances.c       |   3 +-
 34 files changed, 668 insertions(+), 445 deletions(-)

diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am
index 99548ef8..c6b99bfc 100644
--- a/src/backend/Makefile.am
+++ b/src/backend/Makefile.am
@@ -130,7 +130,7 @@ taler_merchant_httpd_SOURCES = \
   taler-merchant-httpd_spa.c \
     taler-merchant-httpd_spa.h \
   taler-merchant-httpd_statics.c \
-    taler-merchant-httpd_statics.h 
+    taler-merchant-httpd_statics.h
 
 taler_merchant_httpd_LDADD = \
   $(top_builddir)/src/backenddb/libtalermerchantdb.la \
@@ -138,6 +138,7 @@ taler_merchant_httpd_LDADD = \
   -ltalertemplating \
   -ltalermhd \
   -ltalerbank \
+  -ltalerkyclogic \
   -ltalerjson \
   -ltalerutil \
   -ltalerpq \
diff --git a/src/backend/taler-merchant-httpd_private-get-instances-ID-kyc.c 
b/src/backend/taler-merchant-httpd_private-get-instances-ID-kyc.c
index e25da307..e7ab0468 100644
--- a/src/backend/taler-merchant-httpd_private-get-instances-ID-kyc.c
+++ b/src/backend/taler-merchant-httpd_private-get-instances-ID-kyc.c
@@ -698,8 +698,7 @@ kyc_with_exchange (void *cls,
     eh,
     ekr->exchange_kyc_serial,
     &h_payto,
-    /* FIXME-#7796: get from settings! */
-    TALER_KYCLOGIC_KYC_UT_BUSINESS,
+    ekr->kc->mi->settings.ut,
     kc->timeout,
     &exchange_check_cb,
     ekr);
diff --git a/src/backend/taler-merchant-httpd_private-get-instances-ID.c 
b/src/backend/taler-merchant-httpd_private-get-instances-ID.c
index 5cc7764f..c51d3de0 100644
--- a/src/backend/taler-merchant-httpd_private-get-instances-ID.c
+++ b/src/backend/taler-merchant-httpd_private-get-instances-ID.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  (C) 2019-2021 Taler Systems SA
+  (C) 2019-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero General Public License as published by the Free 
Software
@@ -73,6 +73,9 @@ get_instances_ID (struct TMH_MerchantInstance *mi,
                                   ja),
     GNUNET_JSON_pack_string ("name",
                              mi->settings.name),
+    GNUNET_JSON_pack_string (
+      "user_type",
+      TALER_KYCLOGIC_kyc_user_type2s (mi->settings.ut)),
     GNUNET_JSON_pack_allow_null (
       GNUNET_JSON_pack_string ("website",
                                mi->settings.website)),
diff --git a/src/backend/taler-merchant-httpd_private-get-instances.c 
b/src/backend/taler-merchant-httpd_private-get-instances.c
index dc0f566f..50b5c0c2 100644
--- a/src/backend/taler-merchant-httpd_private-get-instances.c
+++ b/src/backend/taler-merchant-httpd_private-get-instances.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  (C) 2019-2021 Taler Systems SA
+  (C) 2019-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero General Public License as published by the Free 
Software
@@ -74,6 +74,9 @@ add_instance (void *cls,
                    GNUNET_JSON_PACK (
                      GNUNET_JSON_pack_string ("name",
                                               mi->settings.name),
+                     GNUNET_JSON_pack_string (
+                       "user_type",
+                       TALER_KYCLOGIC_kyc_user_type2s (mi->settings.ut)),
                      GNUNET_JSON_pack_allow_null (
                        GNUNET_JSON_pack_string ("website",
                                                 mi->settings.website)),
diff --git a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c 
b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
index 5bd53a57..77a75da4 100644
--- a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
+++ b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
@@ -64,7 +64,7 @@ patch_instances_ID (struct TMH_MerchantInstance *mi,
   struct TALER_MERCHANTDB_InstanceSettings is;
   json_t *payto_uris;
   const char *name;
-  // FIXME-#7796: uint32_t ut;
+  const char *uts = "business";
   struct TMH_WireMethod *wm_head = NULL;
   struct TMH_WireMethod *wm_tail = NULL;
   struct GNUNET_JSON_Specification spec[] = {
@@ -72,7 +72,10 @@ patch_instances_ID (struct TMH_MerchantInstance *mi,
                            &payto_uris),
     GNUNET_JSON_spec_string ("name",
                              &name),
-    // FIXME-#7796: GNUNET_JSON_spec_uint32 ("user_type", &ut),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_string ("user_type",
+                               &uts),
+      NULL),
     GNUNET_JSON_spec_mark_optional (
       GNUNET_JSON_spec_string ("website",
                                (const char **) &is.website),
@@ -121,7 +124,19 @@ patch_instances_ID (struct TMH_MerchantInstance *mi,
              ? MHD_YES
              : MHD_NO;
   }
-  // FIXME-#7796: is.user_type = (enum TALER_KYCLOGIC_KycUserType) ut;
+  if (NULL == uts)
+    uts = "business";
+  if (GNUNET_OK !=
+      TALER_KYCLOGIC_kyc_user_type_from_string (uts,
+                                                &is.ut))
+  {
+    GNUNET_break_op (0);
+    GNUNET_JSON_parse_free (spec);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_BAD_REQUEST,
+                                       TALER_EC_GENERIC_PARAMETER_MALFORMED,
+                                       "user_type");
+  }
   if (! TMH_location_object_valid (is.address))
   {
     GNUNET_break_op (0);
@@ -187,7 +202,7 @@ patch_instances_ID (struct TMH_MerchantInstance *mi,
     /* Check for equality of settings */
     if (! ( (0 == strcmp (mi->settings.name,
                           name)) &&
-            // FIXME-#7796: (mi->settings.user_type == is.user_type) &&
+            (mi->settings.ut == is.ut) &&
             ((mi->settings.email == is.email) ||
              (NULL != is.email && NULL != mi->settings.email &&
               0 == strcmp (mi->settings.email,
diff --git a/src/backend/taler-merchant-httpd_private-post-instances.c 
b/src/backend/taler-merchant-httpd_private-post-instances.c
index 89bd937e..4d9320ba 100644
--- a/src/backend/taler-merchant-httpd_private-post-instances.c
+++ b/src/backend/taler-merchant-httpd_private-post-instances.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  (C) 2020, 2021 Taler Systems SA
+  (C) 2020-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify
   it under the terms of the GNU Affero General Public License as
@@ -149,6 +149,7 @@ TMH_private_post_instances (const struct TMH_RequestHandler 
*rh,
   struct TALER_MERCHANTDB_InstanceAuthSettings ias;
   json_t *payto_uris;
   const char *auth_token = NULL;
+  const char *uts = "business";
   struct TMH_WireMethod *wm_head = NULL;
   struct TMH_WireMethod *wm_tail = NULL;
   json_t *jauth;
@@ -159,6 +160,10 @@ TMH_private_post_instances (const struct 
TMH_RequestHandler *rh,
                              (const char **) &is.id),
     GNUNET_JSON_spec_string ("name",
                              (const char **) &is.name),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_string ("user_type",
+                               &uts),
+      NULL),
     GNUNET_JSON_spec_mark_optional (
       GNUNET_JSON_spec_string ("email",
                                (const char **) &is.email),
@@ -204,6 +209,20 @@ TMH_private_post_instances (const struct 
TMH_RequestHandler *rh,
              : MHD_NO;
   }
 
+  if (NULL == uts)
+    uts = "business";
+  if (GNUNET_OK !=
+      TALER_KYCLOGIC_kyc_user_type_from_string (uts,
+                                                &is.ut))
+  {
+    GNUNET_break_op (0);
+    GNUNET_JSON_parse_free (spec);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_BAD_REQUEST,
+                                       TALER_EC_GENERIC_PARAMETER_MALFORMED,
+                                       "user_type");
+  }
+
   {
     enum GNUNET_GenericReturnValue ret;
 
diff --git a/src/backenddb/Makefile.am b/src/backenddb/Makefile.am
index a21c209b..008af262 100644
--- a/src/backenddb/Makefile.am
+++ b/src/backenddb/Makefile.am
@@ -16,11 +16,9 @@ sql_DATA = \
   merchant-0002.sql \
   merchant-0003.sql \
   merchant-0004.sql \
+  merchant-0005.sql \
   drop.sql
 
-#  merchant-0005.sql \ -- FIXME-#7796
-
-
 if HAVE_POSTGRESQL
 if HAVE_GNUNETPQ
 plugin_LTLIBRARIES = \
diff --git a/src/backenddb/drop.sql b/src/backenddb/drop.sql
index fbfd9e6a..c4185d8b 100644
--- a/src/backenddb/drop.sql
+++ b/src/backenddb/drop.sql
@@ -23,7 +23,7 @@ BEGIN;
 -- Unlike the other SQL files, it SHOULD be updated to reflect the
 -- latest requirements for dropping tables.
 
--- Unregister patch (0003.sql)
+SELECT _v.unregister_patch('merchant-0005');
 SELECT _v.unregister_patch('merchant-0004');
 SELECT _v.unregister_patch('merchant-0003');
 SELECT _v.unregister_patch('merchant-0002');
diff --git a/src/backenddb/plugin_merchantdb_postgres.c 
b/src/backenddb/plugin_merchantdb_postgres.c
index b49bc54a..5553c059 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -482,6 +482,7 @@ lookup_instances_cb (void *cls,
   {
     bool no_auth;
     bool no_salt;
+    uint32_t ut32;
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_uint64 ("merchant_serial",
                                     &lic->instance_serial),
@@ -499,6 +500,8 @@ lookup_instances_cb (void *cls,
                                     &lic->is.id),
       GNUNET_PQ_result_spec_string ("merchant_name",
                                     &lic->is.name),
+      GNUNET_PQ_result_spec_uint32 ("user_type",
+                                    &ut32),
       TALER_PQ_result_spec_json ("address",
                                  &lic->is.address),
       TALER_PQ_result_spec_json ("jurisdiction",
@@ -547,6 +550,7 @@ lookup_instances_cb (void *cls,
       lic->qs = GNUNET_DB_STATUS_HARD_ERROR;
       return;
     }
+    lic->is.ut = (enum TALER_KYCLOGIC_KycUserType) ut32;
     lic->qs = GNUNET_PQ_eval_prepared_multi_select (lic->pg->conn,
                                                     "lookup_accounts",
                                                     params,
@@ -699,12 +703,14 @@ postgres_insert_instance (
   const struct TALER_MERCHANTDB_InstanceAuthSettings *ias)
 {
   struct PostgresClosure *pg = cls;
+  uint32_t ut32 = (uint32_t) is->ut;
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (merchant_pub),
     GNUNET_PQ_query_param_auto_from_type (&ias->auth_hash),
     GNUNET_PQ_query_param_auto_from_type (&ias->auth_salt),
     GNUNET_PQ_query_param_string (is->id),
     GNUNET_PQ_query_param_string (is->name),
+    GNUNET_PQ_query_param_uint32 (&ut32),
     TALER_PQ_query_param_json (is->address),
     TALER_PQ_query_param_json (is->jurisdiction),
     TALER_PQ_query_param_amount (&is->default_max_deposit_fee),
@@ -1057,6 +1063,7 @@ postgres_update_instance (void *cls,
                           const struct TALER_MERCHANTDB_InstanceSettings *is)
 {
   struct PostgresClosure *pg = cls;
+  uint32_t ut32 = (uint32_t) is->ut;
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_string (is->id),
     GNUNET_PQ_query_param_string (is->name),
@@ -1077,6 +1084,7 @@ postgres_update_instance (void *cls,
     (NULL == is->logo)
     ? GNUNET_PQ_query_param_null ()
     : GNUNET_PQ_query_param_string (is->logo),
+    GNUNET_PQ_query_param_uint32 (&ut32),
     GNUNET_PQ_query_param_end
   };
 
@@ -7627,6 +7635,7 @@ postgres_connect (void *cls)
                             ",auth_salt"
                             ",merchant_id"
                             ",merchant_name"
+                            ",user_type"
                             ",address"
                             ",jurisdiction"
                             ",default_max_deposit_fee_val"
@@ -7649,6 +7658,7 @@ postgres_connect (void *cls)
                             ",auth_salt"
                             ",merchant_id"
                             ",merchant_name"
+                            ",user_type"
                             ",address"
                             ",jurisdiction"
                             ",default_max_deposit_fee_val"
@@ -7671,6 +7681,7 @@ postgres_connect (void *cls)
                             ",auth_salt"
                             ",merchant_id"
                             ",merchant_name"
+                            ",user_type"
                             ",address"
                             ",jurisdiction"
                             ",default_max_deposit_fee_val"
@@ -7684,7 +7695,7 @@ postgres_connect (void *cls)
                             ",email"
                             ",logo)"
                             "VALUES"
-                            "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 
$12, $13, $14, $15, $16, $17)"),
+                            "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 
$12, $13, $14, $15, $16, $17, $18)"),
     /* for postgres_insert_instance() */
     GNUNET_PQ_make_prepare ("insert_keys",
                             "INSERT INTO merchant_keys"
@@ -7771,7 +7782,8 @@ postgres_connect (void *cls)
                             ",website=$12"
                             ",email=$13"
                             ",logo=$14"
-                            " WHERE merchant_id = $1"),
+                            ",user_type=$15"
+                            " WHERE merchant_id=$1"),
     /* for postgres_update_instance_auth() */
     GNUNET_PQ_make_prepare ("update_instance_auth",
                             "UPDATE merchant_instances SET"
diff --git a/src/include/taler_merchant_service.h 
b/src/include/taler_merchant_service.h
index 3d55e4b0..863f1676 100644
--- a/src/include/taler_merchant_service.h
+++ b/src/include/taler_merchant_service.h
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2022 Taler Systems SA
+  Copyright (C) 2014-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero General Public License as published by the Free 
Software
@@ -303,6 +303,7 @@ struct TALER_MERCHANT_ConfigInformation
 };
 
 
+// FIXME: change signature!
 /**
  * Function called with information about the merchant.
  *
@@ -384,6 +385,11 @@ struct TALER_MERCHANT_InstanceInformation
    */
   json_t *payment_targets;
 
+  /**
+   * User type for the instance.
+   */
+  enum TALER_KYCLOGIC_KycUserType ut;
+
 };
 
 
@@ -393,20 +399,48 @@ struct TALER_MERCHANT_InstanceInformation
 struct TALER_MERCHANT_InstancesGetHandle;
 
 
+/**
+ * Response to a GET /instances request.
+ */
+struct TALER_MERCHANT_InstancesGetResponse
+{
+  /**
+   * HTTP response data
+   */
+  struct TALER_MERCHANT_HttpResponse hr;
+
+  union
+  {
+    /**
+     * Data returned on #MHD_HTTP_OK status.
+     */
+    struct
+    {
+      /**
+       * length of the @e iis array
+       */
+      unsigned int iis_length;
+
+      /**
+       * array with instance information of length @e iis_length
+       */
+      const struct TALER_MERCHANT_InstanceInformation *iis;
+    } success;
+  } details;
+
+};
+
+
 /**
  * Function called with the result of the GET /instances operation.
  *
  * @param cls closure
- * @param hr HTTP response data
- * @param iis_length length of the @a iis array
- * @param iis array with instance information of length @a iis_length
+ * @param igr response data
  */
 typedef void
 (*TALER_MERCHANT_InstancesGetCallback)(
   void *cls,
-  const struct TALER_MERCHANT_HttpResponse *hr,
-  unsigned int iis_length,
-  const struct TALER_MERCHANT_InstanceInformation iis[]);
+  const struct TALER_MERCHANT_InstancesGetResponse *igr);
 
 
 /**
@@ -466,6 +500,7 @@ typedef void
  * @param accounts_length how many bank accounts this instance has
  * @param payto_uris URIs of the bank accounts of the merchant instance
  * @param name name of the merchant instance
+ * @param ut user type of the merchant instance
  * @param address physical address of the merchant instance
  * @param jurisdiction jurisdiction of the merchant instance
  * @param default_max_wire_fee default maximum wire fee merchant is willing to 
fully pay
@@ -487,6 +522,7 @@ TALER_MERCHANT_instances_post (
   unsigned int accounts_length,
   const char *payto_uris[],
   const char *name,
+  enum TALER_KYCLOGIC_KycUserType ut,
   const json_t *address,
   const json_t *jurisdiction,
   const struct TALER_Amount *default_max_wire_fee,
@@ -539,6 +575,7 @@ typedef void
  * @param accounts_length length of the @a accounts array
  * @param payto_uris URIs of the bank accounts of the merchant instance
  * @param name name of the merchant instance
+ * @param ut user type of the merchant instance
  * @param address physical address of the merchant instance
  * @param jurisdiction jurisdiction of the merchant instance
  * @param default_max_wire_fee default maximum wire fee merchant is willing to 
fully pay
@@ -559,6 +596,7 @@ TALER_MERCHANT_instance_patch (
   unsigned int accounts_length,
   const char *payto_uris[],
   const char *name,
+  enum TALER_KYCLOGIC_KycUserType ut,
   const json_t *address,
   const json_t *jurisdiction,
   const struct TALER_Amount *default_max_wire_fee,
@@ -682,7 +720,7 @@ struct TALER_MERCHANT_InstanceDetails
   /**
    * public key of the merchant instance
    */
-  const struct TALER_MerchantPublicKeyP *merchant_pub;
+  struct TALER_MerchantPublicKeyP merchant_pub;
 
   /**
    * physical address of the merchant instance
@@ -697,17 +735,12 @@ struct TALER_MERCHANT_InstanceDetails
   /**
    * default maximum wire fee merchant is willing to fully pay
    */
-  const struct TALER_Amount *default_max_wire_fee;
-
-  /**
-   * default amortization factor for excess wire fees
-   */
-  uint32_t default_wire_fee_amortization;
+  struct TALER_Amount default_max_wire_fee;
 
   /**
    * default maximum deposit fee merchant is willing to pay
    */
-  const struct TALER_Amount *default_max_deposit_fee;
+  struct TALER_Amount default_max_deposit_fee;
 
   /**
    * default wire transfer delay merchant will ask for
@@ -718,6 +751,52 @@ struct TALER_MERCHANT_InstanceDetails
    * default validity period for offers merchant makes
    */
   struct GNUNET_TIME_Relative default_pay_delay;
+
+  /**
+   * Default amortization factor for excess wire fees
+   */
+  uint32_t default_wire_fee_amortization;
+
+  /**
+   * User type for the instance.
+   */
+  enum TALER_KYCLOGIC_KycUserType ut;
+};
+
+
+struct TALER_MERCHANT_InstanceGetResponse
+{
+  /**
+   * HTTP response data
+   */
+  struct TALER_MERCHANT_HttpResponse hr;
+
+  union
+  {
+
+    /**
+     * Data returned on #MHD_HTTP_OK.
+     */
+    struct
+    {
+      /**
+       * Length of the @e accounts array.
+       */
+      unsigned int accounts_length;
+
+      /**
+       * bank accounts of the merchant instance
+       */
+      const struct TALER_MERCHANT_Account *accounts;
+
+      /**
+       * Details about the instance.
+       */
+      struct TALER_MERCHANT_InstanceDetails details;
+
+    } success;
+  }
+  details;
 };
 
 
@@ -725,18 +804,12 @@ struct TALER_MERCHANT_InstanceDetails
  * Function called with the result of the GET /instances/$ID operation.
  *
  * @param cls closure
- * @param hr HTTP response data
- * @param accounts_length length of the @a accounts array
- * @param accounts bank accounts of the merchant instance
- * @param details details about the instance configuration
+ * @param igr response details
  */
 typedef void
 (*TALER_MERCHANT_InstanceGetCallback)(
   void *cls,
-  const struct TALER_MERCHANT_HttpResponse *hr,
-  unsigned int accounts_length,
-  const struct TALER_MERCHANT_Account accounts[],
-  const struct TALER_MERCHANT_InstanceDetails *details);
+  const struct TALER_MERCHANT_InstanceGetResponse *igr);
 
 
 /**
@@ -877,20 +950,46 @@ struct TALER_MERCHANT_InventoryEntry
 };
 
 
+/**
+ * Response to a GET /products request.
+ */
+struct TALER_MERCHANT_GetProductsResponse
+{
+  /**
+   * HTTP response details
+   */
+  struct TALER_MERCHANT_HttpResponse hr;
+
+  union
+  {
+    struct
+    {
+
+      /**
+       * length of the @a products array
+       */
+      unsigned int products_length;
+
+      /**
+       * array of products the requested instance offers
+       */
+      const struct TALER_MERCHANT_InventoryEntry *products;
+    } success;
+
+  } details;
+};
+
+
 /**
  * Function called with the result of the GET /products operation.
  *
  * @param cls closure
- * @param hr HTTP response details
- * @param products_length length of the @a products array
- * @param products array of products the requested instance offers
+ * @param gpr response details
  */
 typedef void
 (*TALER_MERCHANT_ProductsGetCallback)(
   void *cls,
-  const struct TALER_MERCHANT_HttpResponse *hr,
-  unsigned int products_length,
-  const struct TALER_MERCHANT_InventoryEntry products[]);
+  const struct TALER_MERCHANT_GetProductsResponse *gpr);
 
 
 /**
@@ -929,6 +1028,7 @@ TALER_MERCHANT_products_get_cancel (
 struct TALER_MERCHANT_ProductGetHandle;
 
 
+// FIXME: change signature!
 /**
  * Function called with the result of the GET /products operation.
  *
@@ -1481,6 +1581,7 @@ struct TALER_MERCHANT_OrderEntry
 };
 
 
+// FIXME: change signature!
 /**
  * Function called with the result of the GET /orders operation.
  *
@@ -2088,6 +2189,7 @@ TALER_MERCHANT_order_delete_cancel (
 struct TALER_MERCHANT_OrderClaimHandle;
 
 
+// FIXME: change signature!
 /**
  * Callback called to process a POST /orders/$ID/claim response.
  *
@@ -2474,6 +2576,7 @@ struct TALER_MERCHANT_AbortedCoin
 };
 
 
+// FIXME: change signature!
 /**
  * Callbacks of this type are used to serve the result of submitting a
  * /orders/$ID/abort request to a merchant.
@@ -2617,6 +2720,7 @@ TALER_MERCHANT_order_forget_cancel (struct
 struct TALER_MERCHANT_OrderRefundHandle;
 
 
+// FIXME: change signature!
 /**
  * Callback to process a POST /orders/ID/refund request
  *
@@ -2712,6 +2816,7 @@ struct TALER_MERCHANT_RefundDetail
 };
 
 
+// FIXME: change signature!
 /**
  * Callback to process a (public) POST /orders/ID/refund request
  *
@@ -2969,6 +3074,8 @@ struct TALER_MERCHANT_TransferData
 
 };
 
+
+// FIXME: change signature!
 /**
  * Callbacks of this type are used to work the result of submitting a
  * GET /transfers request to a merchant
@@ -3047,6 +3154,7 @@ TALER_MERCHANT_transfers_get_cancel (
 struct TALER_MERCHANT_PostReservesHandle;
 
 
+// FIXME: change signature!
 /**
  * Callbacks of this type are used to work the result of submitting a
  * POST /reserves request to a merchant
@@ -3152,6 +3260,7 @@ struct TALER_MERCHANT_ReserveSummary
 };
 
 
+// FIXME: change signature!
 /**
  * Callback to process a GET /reserves request
  *
@@ -3232,6 +3341,7 @@ struct TALER_MERCHANT_TipDetails
 };
 
 
+// FIXME: change signature!
 /**
  * Callback to process a GET /reserve/$RESERVE_PUB request
  *
@@ -3293,6 +3403,7 @@ TALER_MERCHANT_reserve_get_cancel (
 struct TALER_MERCHANT_TipAuthorizeHandle;
 
 
+// FIXME: change signature!
 /**
  * Callback for a /reserves/$RESERVE_PUB/tip-authorize request.  Returns the 
result of
  * the operation.
@@ -3703,6 +3814,7 @@ struct TALER_MERCHANT_TipEntry
 };
 
 
+// FIXME: change signature!
 /**
  * Callback to process a GET /private/tips request.
  *
@@ -3880,6 +3992,7 @@ TALER_MERCHANT_tip_pickup_cancel (struct 
TALER_MERCHANT_TipPickupHandle *tph);
 struct TALER_MERCHANT_TipPickup2Handle;
 
 
+// FIXME: change signature!
 /**
  * Callback for a POST /tips/$TIP_ID/pickup request.  Returns the result of
  * the operation.  Note that the client MUST still do the unblinding of the @a
@@ -4136,6 +4249,7 @@ struct TALER_MERCHANT_TemplateEntry
 };
 
 
+// FIXME: change signature!
 /**
  * Function called with the result of the GET /templates operation.
  *
@@ -4497,6 +4611,7 @@ struct TALER_MERCHANT_WebhookEntry
 };
 
 
+// FIXME: change signature!
 /**
  * Function called with the result of the GET /webhooks operation.
  *
diff --git a/src/include/taler_merchantdb_plugin.h 
b/src/include/taler_merchantdb_plugin.h
index 68cdf3d7..07bfffd6 100644
--- a/src/include/taler_merchantdb_plugin.h
+++ b/src/include/taler_merchantdb_plugin.h
@@ -196,7 +196,6 @@ struct TALER_MERCHANTDB_InstanceSettings
 
   /**
    * Type of user this merchant represents.
-   * FIXME: not yet initialized!
    */
   enum TALER_KYCLOGIC_KycUserType ut;
 };
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 36e249ed..6f1a41fe 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -71,6 +71,7 @@ libtalermerchant_la_LIBADD = \
   -ltalerexchange \
   -ltalercurl \
   -ltalerjson \
+  -ltalerkyclogic \
   -ltalerutil \
   -lgnunetcurl \
   -lgnunetjson \
diff --git a/src/lib/merchant_api_get_instance.c 
b/src/lib/merchant_api_get_instance.c
index bb71a1ed..c8fbfc00 100644
--- a/src/lib/merchant_api_get_instance.c
+++ b/src/lib/merchant_api_get_instance.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2018, 2020 Taler Systems SA
+  Copyright (C) 2014-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Lesser General Public License as published by the Free 
Software
@@ -28,6 +28,7 @@
 #include "taler_merchant_service.h"
 #include "merchant_api_curl_defaults.h"
 #include <taler/taler_json_lib.h>
+#include <taler/taler_kyclogic_lib.h>
 #include <taler/taler_signatures.h>
 
 
@@ -79,9 +80,9 @@ handle_get_instance_finished (void *cls,
 {
   struct TALER_MERCHANT_InstanceGetHandle *igh = cls;
   const json_t *json = response;
-  struct TALER_MERCHANT_HttpResponse hr = {
-    .http_status = (unsigned int) response_code,
-    .reply = json
+  struct TALER_MERCHANT_InstanceGetResponse igr = {
+    .hr.http_status = (unsigned int) response_code,
+    .hr.reply = json
   };
 
   igh->job = NULL;
@@ -93,36 +94,38 @@ handle_get_instance_finished (void *cls,
   case MHD_HTTP_OK:
     {
       json_t *accounts;
-      const char *name;
-      struct TALER_MerchantPublicKeyP merchant_pub;
+      const char *uts;
       json_t *address;
       json_t *jurisdiction;
-      struct TALER_Amount default_max_wire_fee;
-      uint32_t default_wire_fee_amortization;
-      struct TALER_Amount default_max_deposit_fee;
-      struct GNUNET_TIME_Relative default_wire_transfer_delay;
-      struct GNUNET_TIME_Relative default_pay_delay;
       struct GNUNET_JSON_Specification spec[] = {
         GNUNET_JSON_spec_json ("accounts",
                                &accounts),
         GNUNET_JSON_spec_string ("name",
-                                 &name),
-        GNUNET_JSON_spec_fixed_auto ("merchant_pub",
-                                     &merchant_pub),
+                                 &igr.details.success.details.name),
+        GNUNET_JSON_spec_string ("user_type",
+                                 &uts),
+        GNUNET_JSON_spec_fixed_auto (
+          "merchant_pub",
+          &igr.details.success.details.merchant_pub),
         GNUNET_JSON_spec_json ("address",
                                &address),
         GNUNET_JSON_spec_json ("jurisdiction",
                                &jurisdiction),
-        TALER_JSON_spec_amount_any ("default_max_wire_fee",
-                                    &default_max_wire_fee),
-        GNUNET_JSON_spec_uint32 ("default_wire_fee_amortization",
-                                 &default_wire_fee_amortization),
-        TALER_JSON_spec_amount_any ("default_max_deposit_fee",
-                                    &default_max_deposit_fee),
-        GNUNET_JSON_spec_relative_time ("default_wire_transfer_delay",
-                                        &default_wire_transfer_delay),
-        GNUNET_JSON_spec_relative_time ("default_pay_delay",
-                                        &default_pay_delay),
+        TALER_JSON_spec_amount_any (
+          "default_max_wire_fee",
+          &igr.details.success.details.default_max_wire_fee),
+        GNUNET_JSON_spec_uint32 (
+          "default_wire_fee_amortization",
+          &igr.details.success.details.default_wire_fee_amortization),
+        TALER_JSON_spec_amount_any (
+          "default_max_deposit_fee",
+          &igr.details.success.details.default_max_deposit_fee),
+        GNUNET_JSON_spec_relative_time (
+          "default_wire_transfer_delay",
+          &igr.details.success.details.default_wire_transfer_delay),
+        GNUNET_JSON_spec_relative_time (
+          "default_pay_delay",
+          &igr.details.success.details.default_pay_delay),
         GNUNET_JSON_spec_end ()
       };
 
@@ -161,6 +164,8 @@ handle_get_instance_finished (void *cls,
           {
             GNUNET_break_op (0);
             ret = GNUNET_SYSERR;
+            igr.hr.http_status = 0;
+            igr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
             break;
           }
           aa[index].payto_uri = payto_uris[index];
@@ -168,59 +173,57 @@ handle_get_instance_finished (void *cls,
 
         if (GNUNET_OK == ret)
         {
-          struct TALER_MERCHANT_InstanceDetails details = {
-            .name = name,
-            .merchant_pub = &merchant_pub,
-            .address = address,
-            .jurisdiction = jurisdiction,
-            .default_max_wire_fee = &default_max_wire_fee,
-            .default_wire_fee_amortization = default_wire_fee_amortization,
-            .default_max_deposit_fee = &default_max_deposit_fee,
-            .default_wire_transfer_delay = default_wire_transfer_delay,
-            .default_pay_delay = default_pay_delay
-          };
-
+          igr.details.success.details.address = address;
+          igr.details.success.details.jurisdiction = jurisdiction;
+          if (GNUNET_OK !=
+              TALER_KYCLOGIC_kyc_user_type_from_string (
+                uts,
+                &igr.details.success.details.ut))
+          {
+            GNUNET_break_op (0);
+            ret = GNUNET_SYSERR;
+            igr.hr.http_status = 0;
+            igr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+            GNUNET_JSON_parse_free (spec);
+            break;
+          }
+          igr.details.success.accounts_length = accounts_length;
+          igr.details.success.accounts = aa;
           igh->cb (igh->cb_cls,
-                   &hr,
-                   accounts_length,
-                   aa,
-                   &details);
+                   &igr);
           GNUNET_JSON_parse_free (spec);
           TALER_MERCHANT_instance_get_cancel (igh);
           return;
         }
       }
       GNUNET_break_op (0);
-      hr.http_status = 0;
-      hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+      igr.hr.http_status = 0;
+      igr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
       GNUNET_JSON_parse_free (spec);
       break;
     }
   case MHD_HTTP_UNAUTHORIZED:
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    igr.hr.ec = TALER_JSON_get_error_code (json);
+    igr.hr.hint = TALER_JSON_get_error_hint (json);
     /* Nothing really to verify, merchant says we need to authenticate. */
     break;
   case MHD_HTTP_NOT_FOUND:
     /* instance does not exist */
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    igr.hr.ec = TALER_JSON_get_error_code (json);
+    igr.hr.hint = TALER_JSON_get_error_hint (json);
     break;
   default:
     /* unexpected response code */
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    igr.hr.ec = TALER_JSON_get_error_code (json);
+    igr.hr.hint = TALER_JSON_get_error_hint (json);
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Unexpected response code %u/%d\n",
                 (unsigned int) response_code,
-                (int) hr.ec);
+                (int) igr.hr.ec);
     break;
   }
   igh->cb (igh->cb_cls,
-           &hr,
-           0,
-           NULL,
-           NULL);
+           &igr);
   TALER_MERCHANT_instance_get_cancel (igh);
 }
 
diff --git a/src/lib/merchant_api_get_instances.c 
b/src/lib/merchant_api_get_instances.c
index 52a462b9..d7b1b85a 100644
--- a/src/lib/merchant_api_get_instances.c
+++ b/src/lib/merchant_api_get_instances.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2018, 2020 Taler Systems SA
+  Copyright (C) 2014-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Lesser General Public License as published by the Free 
Software
@@ -67,26 +67,37 @@ struct TALER_MERCHANT_InstancesGetHandle
 /**
  * Parse instance information from @a ia.
  *
+ * @param json overall reply body
  * @param ia JSON array (or NULL!) with instance data
  * @param igh operation handle
  * @return #GNUNET_OK on success
  */
-static int
-parse_instances (const json_t *ia,
+static enum GNUNET_GenericReturnValue
+parse_instances (const json_t *json,
+                 const json_t *ia,
                  struct TALER_MERCHANT_InstancesGetHandle *igh)
 {
   unsigned int iis_len = json_array_size (ia);
-  struct TALER_MERCHANT_InstanceInformation iis[iis_len];
+  struct TALER_MERCHANT_InstanceInformation iis[GNUNET_NZL (iis_len)];
   size_t index;
   json_t *value;
-  int ret;
+  enum GNUNET_GenericReturnValue ret;
+  struct TALER_MERCHANT_InstancesGetResponse igr = {
+    .hr.http_status = MHD_HTTP_OK,
+    .hr.reply = json,
+    .details.success.iis_length = iis_len,
+    .details.success.iis = iis
+  };
 
   ret = GNUNET_OK;
   json_array_foreach (ia, index, value) {
     struct TALER_MERCHANT_InstanceInformation *ii = &iis[index];
+    const char *uts;
     struct GNUNET_JSON_Specification spec[] = {
       GNUNET_JSON_spec_string ("name",
                                &ii->name),
+      GNUNET_JSON_spec_string ("user_type",
+                               &uts),
       GNUNET_JSON_spec_string ("id",
                                &ii->id),
       GNUNET_JSON_spec_fixed_auto ("merchant_pub",
@@ -105,10 +116,20 @@ parse_instances (const json_t *ia,
       ret = GNUNET_SYSERR;
       continue;
     }
+    if (GNUNET_OK !=
+        TALER_KYCLOGIC_kyc_user_type_from_string (uts,
+                                                  &ii->ut))
+    {
+      GNUNET_break_op (0);
+      ret = GNUNET_SYSERR;
+      GNUNET_JSON_parse_free (spec);
+      break;
+    }
     if (! json_is_array (ii->payment_targets))
     {
       GNUNET_break_op (0);
       ret = GNUNET_SYSERR;
+      GNUNET_JSON_parse_free (spec);
       break;
     }
     for (unsigned int i = 0; i<json_array_size (ii->payment_targets); i++)
@@ -118,22 +139,20 @@ parse_instances (const json_t *ia,
       {
         GNUNET_break_op (0);
         ret = GNUNET_SYSERR;
+        GNUNET_JSON_parse_free (spec);
         break;
       }
     }
     if (GNUNET_SYSERR == ret)
+    {
+      GNUNET_JSON_parse_free (spec);
       break;
+    }
   }
   if (GNUNET_OK == ret)
   {
-    struct TALER_MERCHANT_HttpResponse hr = {
-      .http_status = MHD_HTTP_OK
-    };
-
     igh->cb (igh->cb_cls,
-             &hr,
-             iis_len,
-             iis);
+             &igr);
     igh->cb = NULL; /* just to be sure */
   }
   for (unsigned int i = 0; i<iis_len; i++)
@@ -158,9 +177,9 @@ handle_instances_finished (void *cls,
 {
   struct TALER_MERCHANT_InstancesGetHandle *igh = cls;
   const json_t *json = response;
-  struct TALER_MERCHANT_HttpResponse hr = {
-    .http_status = (unsigned int) response_code,
-    .reply = json
+  struct TALER_MERCHANT_InstancesGetResponse igr = {
+    .hr.http_status = (unsigned int) response_code,
+    .hr.reply = json
   };
 
   igh->job = NULL;
@@ -183,14 +202,15 @@ handle_instances_finished (void *cls,
                              spec,
                              NULL, NULL))
       {
-        hr.http_status = 0;
-        hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+        igr.hr.http_status = 0;
+        igr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
       }
       else
       {
         if ( (! json_is_array (instances)) ||
              (GNUNET_OK ==
-              parse_instances (instances,
+              parse_instances (json,
+                               instances,
                                igh)) )
         {
           GNUNET_JSON_parse_free (spec);
@@ -199,31 +219,29 @@ handle_instances_finished (void *cls,
         }
         else
         {
-          hr.http_status = 0;
-          hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+          igr.hr.http_status = 0;
+          igr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
         }
       }
       GNUNET_JSON_parse_free (spec);
       break;
     }
   case MHD_HTTP_UNAUTHORIZED:
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    igr.hr.ec = TALER_JSON_get_error_code (json);
+    igr.hr.hint = TALER_JSON_get_error_hint (json);
     break;
   default:
     /* unexpected response code */
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    igr.hr.ec = TALER_JSON_get_error_code (json);
+    igr.hr.hint = TALER_JSON_get_error_hint (json);
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Unexpected response code %u/%d\n",
                 (unsigned int) response_code,
-                (int) hr.ec);
+                (int) igr.hr.ec);
     break;
   }
   igh->cb (igh->cb_cls,
-           &hr,
-           0,
-           NULL);
+           &igr);
   TALER_MERCHANT_instances_get_cancel (igh);
 }
 
diff --git a/src/lib/merchant_api_get_products.c 
b/src/lib/merchant_api_get_products.c
index c3cc30e7..ce26b496 100644
--- a/src/lib/merchant_api_get_products.c
+++ b/src/lib/merchant_api_get_products.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2018, 2020 Taler Systems SA
+  Copyright (C) 2014-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Lesser General Public License as published by the Free 
Software
@@ -67,19 +67,21 @@ struct TALER_MERCHANT_ProductsGetHandle
 /**
  * Parse product information from @a ia.
  *
+ * @param json overall JSON reply
  * @param ia JSON array (or NULL!) with product data
  * @param pgh operation handle
  * @return #GNUNET_OK on success
  */
-static int
-parse_products (const json_t *ia,
+static enum GNUNET_GenericReturnValue
+parse_products (const json_t *json,
+                const json_t *ia,
                 struct TALER_MERCHANT_ProductsGetHandle *pgh)
 {
   unsigned int ies_len = json_array_size (ia);
   struct TALER_MERCHANT_InventoryEntry ies[ies_len];
   size_t index;
   json_t *value;
-  int ret;
+  enum GNUNET_GenericReturnValue ret;
 
   ret = GNUNET_OK;
   json_array_foreach (ia, index, value) {
@@ -104,14 +106,15 @@ parse_products (const json_t *ia,
   }
   if (GNUNET_OK == ret)
   {
-    struct TALER_MERCHANT_HttpResponse hr = {
-      .http_status = MHD_HTTP_OK
+    struct TALER_MERCHANT_GetProductsResponse gpr = {
+      .hr.http_status = MHD_HTTP_OK,
+      .hr.reply = json,
+      .details.success.products_length = ies_len,
+      .details.success.products = ies
     };
 
     pgh->cb (pgh->cb_cls,
-             &hr,
-             ies_len,
-             ies);
+             &gpr);
     pgh->cb = NULL; /* just to be sure */
   }
   return ret;
@@ -133,9 +136,9 @@ handle_get_products_finished (void *cls,
 {
   struct TALER_MERCHANT_ProductsGetHandle *pgh = cls;
   const json_t *json = response;
-  struct TALER_MERCHANT_HttpResponse hr = {
-    .http_status = (unsigned int) response_code,
-    .reply = json
+  struct TALER_MERCHANT_GetProductsResponse gpr = {
+    .hr.http_status = (unsigned int) response_code,
+    .hr.reply = json
   };
 
   pgh->job = NULL;
@@ -158,14 +161,15 @@ handle_get_products_finished (void *cls,
                              spec,
                              NULL, NULL))
       {
-        hr.http_status = 0;
-        hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+        gpr.hr.http_status = 0;
+        gpr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
       }
       else
       {
         if ( (! json_is_array (products)) ||
              (GNUNET_OK ==
-              parse_products (products,
+              parse_products (json,
+                              products,
                               pgh)) )
         {
           GNUNET_JSON_parse_free (spec);
@@ -174,32 +178,30 @@ handle_get_products_finished (void *cls,
         }
         else
         {
-          hr.http_status = 0;
-          hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
+          gpr.hr.http_status = 0;
+          gpr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
         }
       }
       GNUNET_JSON_parse_free (spec);
       break;
     }
   case MHD_HTTP_UNAUTHORIZED:
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    gpr.hr.ec = TALER_JSON_get_error_code (json);
+    gpr.hr.hint = TALER_JSON_get_error_hint (json);
     /* Nothing really to verify, merchant says we need to authenticate. */
     break;
   default:
     /* unexpected response code */
-    hr.ec = TALER_JSON_get_error_code (json);
-    hr.hint = TALER_JSON_get_error_hint (json);
+    gpr.hr.ec = TALER_JSON_get_error_code (json);
+    gpr.hr.hint = TALER_JSON_get_error_hint (json);
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Unexpected response code %u/%d\n",
                 (unsigned int) response_code,
-                (int) hr.ec);
+                (int) gpr.hr.ec);
     break;
   }
   pgh->cb (pgh->cb_cls,
-           &hr,
-           0,
-           NULL);
+           &gpr);
   TALER_MERCHANT_products_get_cancel (pgh);
 }
 
diff --git a/src/lib/merchant_api_patch_instance.c 
b/src/lib/merchant_api_patch_instance.c
index 0613a852..9d4cea84 100644
--- a/src/lib/merchant_api_patch_instance.c
+++ b/src/lib/merchant_api_patch_instance.c
@@ -31,6 +31,7 @@
 #include "merchant_api_curl_defaults.h"
 #include "merchant_api_common.h"
 #include <taler/taler_json_lib.h>
+#include <taler/taler_kyclogic_lib.h>
 #include <taler/taler_curl_lib.h>
 
 
@@ -160,6 +161,7 @@ TALER_MERCHANT_instance_patch (
   unsigned int accounts_length,
   const char *payto_uris[],
   const char *name,
+  enum TALER_KYCLOGIC_KycUserType ut,
   const json_t *address,
   const json_t *jurisdiction,
   const struct TALER_Amount *default_max_wire_fee,
@@ -173,7 +175,14 @@ TALER_MERCHANT_instance_patch (
   struct TALER_MERCHANT_InstancePatchHandle *iph;
   json_t *jpayto_uris;
   json_t *req_obj;
+  const char *uts;
 
+  uts = TALER_KYCLOGIC_kyc_user_type2s (ut);
+  if (NULL == uts)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
   jpayto_uris = json_array ();
   if (NULL == jpayto_uris)
   {
@@ -196,6 +205,8 @@ TALER_MERCHANT_instance_patch (
                                   jpayto_uris),
     GNUNET_JSON_pack_string ("name",
                              name),
+    GNUNET_JSON_pack_string ("user_type",
+                             uts),
     GNUNET_JSON_pack_object_incref ("address",
                                     (json_t *) address),
     GNUNET_JSON_pack_object_incref ("jurisdiction",
diff --git a/src/lib/merchant_api_post_instances.c 
b/src/lib/merchant_api_post_instances.c
index 183b3400..85069dc3 100644
--- a/src/lib/merchant_api_post_instances.c
+++ b/src/lib/merchant_api_post_instances.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2020 Taler Systems SA
+  Copyright (C) 2020-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as
@@ -32,6 +32,7 @@
 #include "merchant_api_common.h"
 #include <taler/taler_json_lib.h>
 #include <taler/taler_curl_lib.h>
+#include <taler/taler_kyclogic_lib.h>
 
 
 /**
@@ -166,6 +167,7 @@ TALER_MERCHANT_instances_post (
   unsigned int accounts_length,
   const char *payto_uris[],
   const char *name,
+  enum TALER_KYCLOGIC_KycUserType ut,
   const json_t *address,
   const json_t *jurisdiction,
   const struct TALER_Amount *default_max_wire_fee,
@@ -181,7 +183,14 @@ TALER_MERCHANT_instances_post (
   json_t *jpayto_uris;
   json_t *req_obj;
   json_t *auth_obj;
+  const char *uts;
 
+  uts = TALER_KYCLOGIC_kyc_user_type2s (ut);
+  if (NULL == uts)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
   if (NULL != auth_token)
   {
     if (0 != strncasecmp (RFC_8959_PREFIX,
@@ -236,6 +245,8 @@ TALER_MERCHANT_instances_post (
                              instance_id),
     GNUNET_JSON_pack_string ("name",
                              name),
+    GNUNET_JSON_pack_string ("user_type",
+                             uts),
     GNUNET_JSON_pack_object_incref ("address",
                                     (json_t *) address),
     GNUNET_JSON_pack_object_incref ("jurisdiction",
diff --git a/src/testing/test_key_rotation.sh b/src/testing/test_key_rotation.sh
index b3609b1d..7c116511 100755
--- a/src/testing/test_key_rotation.sh
+++ b/src/testing/test_key_rotation.sh
@@ -190,7 +190,7 @@ echo "OK"
 echo -n "Setting up merchant instance"
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_api.c b/src/testing/test_merchant_api.c
index b25e7519..d4fe16cd 100644
--- a/src/testing/test_merchant_api.c
+++ b/src/testing/test_merchant_api.c
@@ -241,7 +241,8 @@ run (void *cls,
                                         NULL,
                                         NULL,
                                         EXCHANGE_URL,
-                                        MHD_HTTP_NO_CONTENT),
+                                        MHD_HTTP_NO_CONTENT,
+                                        TALER_AML_NORMAL),
     TALER_TESTING_cmd_merchant_post_orders_no_claim ("create-proposal-4",
                                                      merchant_url,
                                                      MHD_HTTP_OK,
@@ -318,7 +319,7 @@ run (void *cls,
     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1",
                                              merchant_url,
                                              MHD_HTTP_OK,
-                                             "1", 
+                                             "1",
                                              GNUNET_TIME_UNIT_ZERO_TS,
                                              GNUNET_TIME_UNIT_FOREVER_TS,
                                              true,
@@ -337,7 +338,7 @@ run (void *cls,
     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1-idem",
                                              merchant_url,
                                              MHD_HTTP_OK,
-                                             "1", 
+                                             "1",
                                              GNUNET_TIME_UNIT_ZERO_TS,
                                              GNUNET_TIME_UNIT_FOREVER_TS,
                                              true,
@@ -433,8 +434,8 @@ run (void *cls,
                                                   MHD_HTTP_OK,
                                                   NULL,
                                                   "poll-order-wallet-start-1"),
-      /* Check for webhook */
-         cmd_webhook ("pending-webhooks-pay-w1"),
+    /* Check for webhook */
+    cmd_webhook ("pending-webhooks-pay-w1"),
     /* Check webhook did anything: have a command that inspects traits of the 
testserver
        and check if the traits have the right values set! */
     TALER_TESTING_cmd_checkserver ("check-http-server-for-webhooks",
@@ -498,7 +499,7 @@ run (void *cls,
                                                merchant_url,
                                                PAYTO_I1,
                                                "EUR:4.98",
-                                               NULL ,
+                                               NULL,
                                                /*non-routable IP address
                                                so we are sure to not get
                                                any reply*/
@@ -630,7 +631,7 @@ run (void *cls,
                                              "order-p3",
                                              GNUNET_TIME_UNIT_ZERO_TS,
                                              GNUNET_TIME_UNIT_FOREVER_TS,
-                                             true, 
+                                             true,
                                              "EUR:5.0",
                                              "unsupported-wire-method",
                                              "product-3/2",
@@ -1545,7 +1546,7 @@ run (void *cls,
                                           "EUR:4.99",
                                           NULL),
 
-    
+
     TALER_TESTING_cmd_end ()
   };
 
@@ -1969,7 +1970,7 @@ run (void *cls,
     TALER_TESTING_cmd_batch ("pay-abort",
                              pay_abort),
     TALER_TESTING_cmd_batch ("refund",
-                            refund),
+                             refund),
     TALER_TESTING_cmd_batch ("tip",
                              tip),
     TALER_TESTING_cmd_batch ("templates",
diff --git a/src/testing/test_merchant_instance_auth.sh 
b/src/testing/test_merchant_instance_auth.sh
index f4534b9a..4c3bf0a0 100755
--- a/src/testing/test_merchant_instance_auth.sh
+++ b/src/testing/test_merchant_instance_auth.sh
@@ -30,7 +30,7 @@ echo -n "Configuring 'default' instance ..."
 
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"token","token":"secret-token:new_value"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
+    -d 
'{"auth":{"method":"token","token":"secret-token:new_value"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_instance_creation.sh 
b/src/testing/test_merchant_instance_creation.sh
index 9fee5773..27d35365 100755
--- a/src/testing/test_merchant_instance_creation.sh
+++ b/src/testing/test_merchant_instance_creation.sh
@@ -40,7 +40,7 @@ echo -n "Configuring default instance ..."
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_instance_purge.sh 
b/src/testing/test_merchant_instance_purge.sh
index 60467385..01653415 100755
--- a/src/testing/test_merchant_instance_purge.sh
+++ b/src/testing/test_merchant_instance_purge.sh
@@ -24,7 +24,7 @@ echo -n "Configuring default instance ..."
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_instance_response.sh 
b/src/testing/test_merchant_instance_response.sh
index 41ac983b..c05b000f 100755
--- a/src/testing/test_merchant_instance_response.sh
+++ b/src/testing/test_merchant_instance_response.sh
@@ -45,7 +45,7 @@ fi
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"token","token":"secret-token:other_secret"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
+    -d 
'{"auth":{"method":"token","token":"secret-token:other_secret"},"payto_uris":["payto://x-taler-bank/localhost/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_kyc.sh b/src/testing/test_merchant_kyc.sh
index e95e7586..e7364af3 100755
--- a/src/testing/test_merchant_kyc.sh
+++ b/src/testing/test_merchant_kyc.sh
@@ -25,7 +25,7 @@ echo -n "Configuring a merchant instance before configuring 
the default instance
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43","payto://x-taler-bank/localhost:8082/44"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43","payto://x-taler-bank/localhost:8082/44"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_order_autocleanup.sh 
b/src/testing/test_merchant_order_autocleanup.sh
index 4a53edca..a3e61de8 100755
--- a/src/testing/test_merchant_order_autocleanup.sh
+++ b/src/testing/test_merchant_order_autocleanup.sh
@@ -28,7 +28,7 @@ echo -n "Configuring merchant instance ..."
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43","payto://x-taler-bank/localhost:8082/44"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43","payto://x-taler-bank/localhost:8082/44"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
@@ -41,7 +41,7 @@ fi
 STATUS=$(curl -H "Content-Type: application/json" -X PATCH \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/instances/default/private/ \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:8082/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_order_creation.sh 
b/src/testing/test_merchant_order_creation.sh
index 684803b8..0c2188e0 100755
--- a/src/testing/test_merchant_order_creation.sh
+++ b/src/testing/test_merchant_order_creation.sh
@@ -46,7 +46,7 @@ FORTYTHREE=`get_payto_uri fortythree x`
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'","payto://iban/SANDBOXX/DE270744?receiver-name=Forty+Four"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000000},"default_pay_delay":{"d_us": 60000000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'","payto://iban/SANDBOXX/DE270744?receiver-name=Forty+Four"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000000},"default_pay_delay":{"d_us": 60000000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
@@ -60,7 +60,7 @@ fi
 STATUS=$(curl -H "Content-Type: application/json" -X PATCH \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/instances/default/private/ \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000000},"default_pay_delay":{"d_us": 60000000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000000},"default_pay_delay":{"d_us": 60000000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_product_creation.sh 
b/src/testing/test_merchant_product_creation.sh
index 702b0e53..51910d4a 100755
--- a/src/testing/test_merchant_product_creation.sh
+++ b/src/testing/test_merchant_product_creation.sh
@@ -24,7 +24,7 @@ echo -n "Configuring merchant instance ..."
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["'$FORTYTHREE'"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_reserve_creation.sh 
b/src/testing/test_merchant_reserve_creation.sh
index f97986b3..58b6611a 100755
--- a/src/testing/test_merchant_reserve_creation.sh
+++ b/src/testing/test_merchant_reserve_creation.sh
@@ -28,7 +28,7 @@ FORTYTHREE=`get_payto_uri fortythree x`
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:1'$NEXUS_PORT'/43"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["payto://x-taler-bank/localhost:1'$NEXUS_PORT'/43"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/test_merchant_transfer_tracking.sh 
b/src/testing/test_merchant_transfer_tracking.sh
index 8fb7be64..646589b6 100755
--- a/src/testing/test_merchant_transfer_tracking.sh
+++ b/src/testing/test_merchant_transfer_tracking.sh
@@ -47,7 +47,7 @@ GNUNET_PAYTO=`get_payto_uri gnunet x`
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["'$TOR_PAYTO'","'$GNUNET_PAYTO'"],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["'$TOR_PAYTO'","'$GNUNET_PAYTO'"],"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
@@ -67,7 +67,7 @@ TUTORIAL_PAYTO=`get_payto_uri tutorial x`
 STATUS=$(curl -H "Content-Type: application/json" -X POST \
     -H 'Authorization: Bearer secret-token:super_secret' \
     http://localhost:9966/management/instances \
-    -d 
'{"auth":{"method":"external"},"payto_uris":["'$SURVEY_PAYTO'","'$TUTORIAL_PAYTO'"],"id":"test","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
+    -d 
'{"auth":{"method":"external"},"payto_uris":["'$SURVEY_PAYTO'","'$TUTORIAL_PAYTO'"],"id":"test","name":"default","user_type":"business","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1",
 
"default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us"
 : 50000000},"default_pay_delay":{"d_us": 60000000}}' \
     -w "%{http_code}" -s -o /dev/null)
 
 if [ "$STATUS" != "204" ]
diff --git a/src/testing/testing_api_cmd_get_instance.c 
b/src/testing/testing_api_cmd_get_instance.c
index 95dc7282..0127a13d 100644
--- a/src/testing/testing_api_cmd_get_instance.c
+++ b/src/testing/testing_api_cmd_get_instance.c
@@ -96,17 +96,11 @@ struct GetInstanceState
  * Callback for a /get/instance/$ID operation.
  *
  * @param cls closure for this function
- * @param hr HTTP response
- * @param accounts_length how many bank accounts the instance has
- * @param accounts the list of the instance's bank accounts
- * @param details all the details related to this particular instance
+ * @param igr response
  */
 static void
 get_instance_cb (void *cls,
-                 const struct TALER_MERCHANT_HttpResponse *hr,
-                 unsigned int accounts_length,
-                 const struct TALER_MERCHANT_Account accounts[],
-                 const struct TALER_MERCHANT_InstanceDetails *details)
+                 const struct TALER_MERCHANT_InstanceGetResponse *igr)
 {
   struct GetInstanceState *gis = cls;
   const struct TALER_TESTING_Command *instance_cmd;
@@ -116,210 +110,218 @@ get_instance_cb (void *cls,
     gis->instance_reference);
 
   gis->igh = NULL;
-  if (gis->http_status != hr->http_status)
+  if (gis->http_status != igr->hr.http_status)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Unexpected response code %u (%d) to command %s\n",
-                hr->http_status,
-                (int) hr->ec,
+                igr->hr.http_status,
+                (int) igr->hr.ec,
                 TALER_TESTING_interpreter_get_current_label (gis->is));
     TALER_TESTING_interpreter_fail (gis->is);
     return;
   }
-  switch (hr->http_status)
+  switch (igr->hr.http_status)
   {
   case MHD_HTTP_OK:
     {
-      const char **name;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_instance_name (instance_cmd,
-                                                 &name))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (0 != strcmp (details->name,
-                       *name))
+      const struct TALER_MERCHANT_InstanceDetails *details =
+        &igr->details.success.details;
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance name does not match: Got `%s', wanted `%s'\n",
-                    details->name,
-                    *name);
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const char **name;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_instance_name (instance_cmd,
+                                                   &name))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (0 != strcmp (details->name,
+                         *name))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance name does not match: Got `%s', wanted `%s'\n",
+                      details->name,
+                      *name);
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const json_t *address;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_address (instance_cmd,
-                                           &address))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (1 != json_equal (details->address,
-                           address))
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance address does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const json_t *address;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_address (instance_cmd,
+                                             &address))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (1 != json_equal (details->address,
+                             address))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance address does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const struct json_t *jurisdiction;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_jurisdiction (instance_cmd,
-                                                &jurisdiction))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (1 != json_equal (details->jurisdiction,
-                           jurisdiction))
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance jurisdiction does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const struct json_t *jurisdiction;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_jurisdiction (instance_cmd,
+                                                  &jurisdiction))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (1 != json_equal (details->jurisdiction,
+                             jurisdiction))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance jurisdiction does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const struct TALER_Amount *default_max_wire_fee;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_max_wire_fee (instance_cmd,
-                                                &default_max_wire_fee))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if ((GNUNET_OK != TALER_amount_cmp_currency (
-             details->default_max_wire_fee,
-             default_max_wire_fee)) ||
-          (0 != TALER_amount_cmp (details->default_max_wire_fee,
-                                  default_max_wire_fee)))
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance default max wire fee does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const struct TALER_Amount *default_max_wire_fee;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_max_wire_fee (instance_cmd,
+                                                  &default_max_wire_fee))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if ((GNUNET_OK !=
+             TALER_amount_cmp_currency (
+               &details->default_max_wire_fee,
+               default_max_wire_fee)) ||
+            (0 != TALER_amount_cmp (&details->default_max_wire_fee,
+                                    default_max_wire_fee)))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance default max wire fee does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const uint32_t *default_wire_fee_amortization;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_wire_fee_amortization (instance_cmd,
-                                                         &
-                                                         
default_wire_fee_amortization))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (details->default_wire_fee_amortization !=
-          *default_wire_fee_amortization)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance default wire fee amortization does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const uint32_t *default_wire_fee_amortization;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_wire_fee_amortization (
+              instance_cmd,
+              &default_wire_fee_amortization))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (details->default_wire_fee_amortization !=
+            *default_wire_fee_amortization)
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance default wire fee amortization does not 
match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const struct TALER_Amount *default_max_deposit_fee;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_max_deposit_fee (instance_cmd,
-                                                   &default_max_deposit_fee))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if ( (GNUNET_OK !=
-            TALER_amount_cmp_currency (
-              details->default_max_deposit_fee,
-              default_max_deposit_fee)) ||
-           (0 != TALER_amount_cmp (details->default_max_deposit_fee,
-                                   default_max_deposit_fee)) )
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance default max deposit fee %s does not match\n",
-                    TALER_amount2s (details->default_max_deposit_fee));
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const struct TALER_Amount *default_max_deposit_fee;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_max_deposit_fee (instance_cmd,
+                                                     &default_max_deposit_fee))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if ( (GNUNET_OK !=
+              TALER_amount_cmp_currency (
+                &details->default_max_deposit_fee,
+                default_max_deposit_fee)) ||
+             (0 != TALER_amount_cmp (&details->default_max_deposit_fee,
+                                     default_max_deposit_fee)) )
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance default max deposit fee %s does not match\n",
+                      TALER_amount2s (&details->default_max_deposit_fee));
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const struct GNUNET_TIME_Relative *default_wire_transfer_delay;
-
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_wire_delay (instance_cmd,
-                                              &default_wire_transfer_delay))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (details->default_wire_transfer_delay.rel_value_us !=
-          default_wire_transfer_delay->rel_value_us)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance default wire transfer delay does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const struct GNUNET_TIME_Relative *default_wire_transfer_delay;
+
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_wire_delay (instance_cmd,
+                                                &default_wire_transfer_delay))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (details->default_wire_transfer_delay.rel_value_us !=
+            default_wire_transfer_delay->rel_value_us)
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance default wire transfer delay does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    {
-      const struct GNUNET_TIME_Relative *default_pay_delay;
-      if (GNUNET_OK !=
-          TALER_TESTING_get_trait_pay_delay (instance_cmd,
-                                             &default_pay_delay))
-        TALER_TESTING_interpreter_fail (gis->is);
-      if (details->default_pay_delay.rel_value_us !=
-          default_pay_delay->rel_value_us)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Instance default pay delay does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
+        const struct GNUNET_TIME_Relative *default_pay_delay;
+        if (GNUNET_OK !=
+            TALER_TESTING_get_trait_pay_delay (instance_cmd,
+                                               &default_pay_delay))
+          TALER_TESTING_interpreter_fail (gis->is);
+        if (details->default_pay_delay.rel_value_us !=
+            default_pay_delay->rel_value_us)
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Instance default pay delay does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
       }
-    }
-    /* We aren't guaranteed an order for the accounts, so we just have to check
-       that we can match each account returned with exactly one account
-       expected. */
-    if (gis->cmp_accounts)
-    {
-      unsigned int expected_accounts_length =
-        gis->active_accounts_length + gis->inactive_accounts_length;
-      unsigned int matches[accounts_length];
-
-      if (accounts_length != expected_accounts_length)
+      /* We aren't guaranteed an order for the accounts, so we just have to 
check
+         that we can match each account returned with exactly one account
+         expected. */
+      if (gis->cmp_accounts)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Accounts length does not match\n");
-        TALER_TESTING_interpreter_fail (gis->is);
-        return;
-      }
+        unsigned int have_al = igr->details.success.accounts_length;
+        unsigned int expected_accounts_length =
+          gis->active_accounts_length + gis->inactive_accounts_length;
+        unsigned int matches[GNUNET_NZL (have_al)];
+
+        if (have_al != expected_accounts_length)
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Accounts length does not match\n");
+          TALER_TESTING_interpreter_fail (gis->is);
+          return;
+        }
 
-      memset (matches,
-              0,
-              sizeof (unsigned int) * accounts_length);
+        memset (matches,
+                0,
+                sizeof (matches));
 
-      /* Compare the accounts */
-      for (unsigned int i = 0; i < accounts_length; ++i)
-      {
-        for (unsigned int j = 0; j < gis->active_accounts_length; ++j)
+        /* Compare the accounts */
+        for (unsigned int i = 0; i < have_al; ++i)
         {
-          if ((0 == strcasecmp (accounts[i].payto_uri,
-                                gis->active_accounts[j])) &&
-              (true == accounts[i].active))
+          const struct TALER_MERCHANT_Account *account
+            = &igr->details.success.accounts[i];
+          for (unsigned int j = 0; j < gis->active_accounts_length; ++j)
           {
-            matches[i] += 1;
+            if ((0 == strcasecmp (account->payto_uri,
+                                  gis->active_accounts[j])) &&
+                account->active)
+            {
+              matches[i] += 1;
+            }
           }
-        }
-        for (unsigned int j = 0; j < gis->inactive_accounts_length; ++j)
-        {
-          if ((0 == strcasecmp (accounts[i].payto_uri,
-                                gis->inactive_accounts[j])) &&
-              (false == accounts[i].active))
+          for (unsigned int j = 0; j < gis->inactive_accounts_length; ++j)
           {
-            matches[i] += 1;
+            if ((0 == strcasecmp (account->payto_uri,
+                                  gis->inactive_accounts[j])) &&
+                (! account->active))
+            {
+              matches[i] += 1;
+            }
           }
         }
-      }
 
-      // Each account should have exactly one match.
-      for (unsigned int i = 0; i < accounts_length; ++i)
-      {
-        if (1 != matches[i])
+        // Each account should have exactly one match.
+        for (unsigned int i = 0; i < have_al; ++i)
         {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Instance account does not match\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
+          if (1 != matches[i])
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Instance account does not match\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
         }
       }
     }
@@ -331,7 +333,7 @@ get_instance_cb (void *cls,
   default:
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "Unhandled HTTP status %u for GET instance ID.\n",
-                hr->http_status);
+                igr->hr.http_status);
   }
   TALER_TESTING_interpreter_next (gis->is);
 }
diff --git a/src/testing/testing_api_cmd_get_instances.c 
b/src/testing/testing_api_cmd_get_instances.c
index 8aee04b1..5fb17746 100644
--- a/src/testing/testing_api_cmd_get_instances.c
+++ b/src/testing/testing_api_cmd_get_instances.c
@@ -71,16 +71,13 @@ struct GetInstancesState
  * Callback for a GET /instances operation.
  *
  * @param cls closure for this function
- * @param hr HTTP response
- * @param iis_length how many instances are returned
- * @param iis all the instances details
+ * @param igr response
  */
 static void
 get_instances_cb (void *cls,
-                  const struct TALER_MERCHANT_HttpResponse *hr,
-                  unsigned int iis_length,
-                  const struct TALER_MERCHANT_InstanceInformation iis[])
+                  const struct TALER_MERCHANT_InstancesGetResponse *igr)
 {
+  const struct TALER_MERCHANT_HttpResponse *hr = &igr->hr;
   struct GetInstancesState *gis = cls;
 
   gis->igh = NULL;
@@ -97,68 +94,75 @@ get_instances_cb (void *cls,
   switch (hr->http_status)
   {
   case MHD_HTTP_OK:
-    if (iis_length != gis->instances_length)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Length of instances found does not match\n");
-      TALER_TESTING_interpreter_fail (gis->is);
-      return;
-    }
-    for (unsigned int i = 0; i < iis_length; ++i)
-    {
-      const struct TALER_TESTING_Command *instance_cmd;
-
-      instance_cmd = TALER_TESTING_interpreter_lookup_command (
-        gis->is,
-        gis->instances[i]);
+      unsigned int iis_length
+        = igr->details.success.iis_length;
+      const struct TALER_MERCHANT_InstanceInformation *iis
+        = igr->details.success.iis;
 
+      if (iis_length != gis->instances_length)
       {
-        const char **name;
-
-        if (GNUNET_OK !=
-            TALER_TESTING_get_trait_instance_name (instance_cmd,
-                                                   &name))
-        {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Could not fetch instance name\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
-        }
-        if (0 != strcmp (iis[i].name,
-                         *name))
-        {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Instance name does not match\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
-        }
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Length of instances found does not match\n");
+        TALER_TESTING_interpreter_fail (gis->is);
+        return;
       }
-
+      for (unsigned int i = 0; i < iis_length; ++i)
       {
-        const char **id;
+        const struct TALER_TESTING_Command *instance_cmd;
+
+        instance_cmd = TALER_TESTING_interpreter_lookup_command (
+          gis->is,
+          gis->instances[i]);
 
-        if (GNUNET_OK !=
-            TALER_TESTING_get_trait_instance_id (instance_cmd,
-                                                 &id))
         {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Could not fetch instance id\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
+          const char **name;
+
+          if (GNUNET_OK !=
+              TALER_TESTING_get_trait_instance_name (instance_cmd,
+                                                     &name))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Could not fetch instance name\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
+          if (0 != strcmp (iis[i].name,
+                           *name))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Instance name does not match\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
         }
-        if (0 != strcmp (iis[i].id,
-                         *id))
+
         {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Instance id does not match\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
+          const char **id;
+
+          if (GNUNET_OK !=
+              TALER_TESTING_get_trait_instance_id (instance_cmd,
+                                                   &id))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Could not fetch instance id\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
+          if (0 != strcmp (iis[i].id,
+                           *id))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Instance id does not match\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
         }
       }
-    }
 
-    // FIXME: compare payment_targets
-    break;
+      // FIXME: compare payment_targets
+      break;
+    }
   default:
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "Unhandled HTTP status %u for GET /instances.\n",
diff --git a/src/testing/testing_api_cmd_get_products.c 
b/src/testing/testing_api_cmd_get_products.c
index 190bb4c1..dbf5be39 100644
--- a/src/testing/testing_api_cmd_get_products.c
+++ b/src/testing/testing_api_cmd_get_products.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2020 Taler Systems SA
+  Copyright (C) 2020-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as
@@ -71,17 +71,14 @@ struct GetProductsState
  * Callback for a GET /products operation.
  *
  * @param cls closure for this function
- * @param hr HTTP response details
- * @param products_length length of the @a products array
- * @param products array of products the requested instance offers
+ * @param gpr response details
  */
 static void
 get_products_cb (void *cls,
-                 const struct TALER_MERCHANT_HttpResponse *hr,
-                 unsigned int products_length,
-                 const struct TALER_MERCHANT_InventoryEntry products[])
+                 const struct TALER_MERCHANT_GetProductsResponse *gpr)
 {
   struct GetProductsState *gis = cls;
+  const struct TALER_MERCHANT_HttpResponse *hr = &gpr->hr;
 
   gis->igh = NULL;
   if (gis->http_status != hr->http_status)
@@ -97,40 +94,47 @@ get_products_cb (void *cls,
   switch (hr->http_status)
   {
   case MHD_HTTP_OK:
-    if (products_length != gis->products_length)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Length of products found does not match\n");
-      TALER_TESTING_interpreter_fail (gis->is);
-      return;
-    }
-    for (unsigned int i = 0; i < gis->products_length; ++i)
-    {
-      const struct TALER_TESTING_Command *product_cmd;
-
-      product_cmd = TALER_TESTING_interpreter_lookup_command (
-        gis->is,
-        gis->products[i]);
+      unsigned int products_length
+        = gpr->details.success.products_length;
+      const struct TALER_MERCHANT_InventoryEntry *products
+        = gpr->details.success.products;
 
+      if (products_length != gis->products_length)
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Length of products found does not match\n");
+        TALER_TESTING_interpreter_fail (gis->is);
+        return;
+      }
+      for (unsigned int i = 0; i < gis->products_length; ++i)
       {
-        const char **product_id;
+        const struct TALER_TESTING_Command *product_cmd;
+
+        product_cmd = TALER_TESTING_interpreter_lookup_command (
+          gis->is,
+          gis->products[i]);
 
-        if (GNUNET_OK !=
-            TALER_TESTING_get_trait_product_id (product_cmd,
-                                                &product_id))
-        {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Could not fetch product id\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
-        }
-        if (0 != strcmp (products[i].product_id,
-                         *product_id))
         {
-          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                      "Product id does not match\n");
-          TALER_TESTING_interpreter_fail (gis->is);
-          return;
+          const char **product_id;
+
+          if (GNUNET_OK !=
+              TALER_TESTING_get_trait_product_id (product_cmd,
+                                                  &product_id))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Could not fetch product id\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
+          if (0 != strcmp (products[i].product_id,
+                           *product_id))
+          {
+            GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                        "Product id does not match\n");
+            TALER_TESTING_interpreter_fail (gis->is);
+            return;
+          }
         }
       }
     }
diff --git a/src/testing/testing_api_cmd_patch_instance.c 
b/src/testing/testing_api_cmd_patch_instance.c
index 348163af..4ea0fba1 100644
--- a/src/testing/testing_api_cmd_patch_instance.c
+++ b/src/testing/testing_api_cmd_patch_instance.c
@@ -179,6 +179,7 @@ patch_instance_run (void *cls,
                                             pis->payto_uris_length,
                                             pis->payto_uris,
                                             pis->name,
+                                            TALER_KYCLOGIC_KYC_UT_BUSINESS,
                                             pis->address,
                                             pis->jurisdiction,
                                             &pis->default_max_wire_fee,
diff --git a/src/testing/testing_api_cmd_post_instances.c 
b/src/testing/testing_api_cmd_post_instances.c
index 4d1f0d26..61e54e53 100644
--- a/src/testing/testing_api_cmd_post_instances.c
+++ b/src/testing/testing_api_cmd_post_instances.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2020 Taler Systems SA
+  Copyright (C) 2020-2023 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as
@@ -186,6 +186,7 @@ post_instances_run (void *cls,
                                             pis->payto_uris_length,
                                             pis->payto_uris,
                                             pis->name,
+                                            TALER_KYCLOGIC_KYC_UT_BUSINESS,
                                             pis->address,
                                             pis->jurisdiction,
                                             &pis->default_max_wire_fee,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]