diff --git a/docs/api.md b/docs/api.md
index 25f04517bcffc801abae4b6fdd4e9115dc2f039a..21ca503ef6565fea59bf11378bdf0ec795777dc9 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -108,7 +108,7 @@ Can take either amount or price. If both supplied only amount is taken into acco
 ### Example Response
 
 Successfull discharge will have a response code of `201`  
-If the key cannot be charged because it is already charged with too many Orders response code will be `403`
+If the key cannot be charged because it is already charged with too many Orders response code will be `423`
 
 ```json
 {
diff --git a/pass/routes/api.js b/pass/routes/api.js
index 23793e2c89de777005836ae493556aae9f67c7e5..62ce846b16a096a731f8670418001d7f6bcbb03d 100644
--- a/pass/routes/api.js
+++ b/pass/routes/api.js
@@ -26,7 +26,7 @@ router.use((req, res, next) => {
   }
 });
 
-router.post("/key/create", (req, res) => {
+router.post("/key/create", async (req, res) => {
   let amount = req.body.amount;
   if (!amount) {
     // If amount is not given but price is
@@ -46,11 +46,9 @@ router.post("/key/create", (req, res) => {
   /**
    * @type {Order}
    */
+  let key = await Key.GET_NEW_KEY();
   let new_order;
-  Key.GET_NEW_KEY()
-    .then((key) =>
-      Order.CREATE_NEW_ORDER(amount, key.get_key(), new Manual(note))
-    )
+  Order.CREATE_NEW_ORDER(amount, key.get_key(), new Manual(note))
     .then((order) => {
       new_order = order;
       return new_order.captureOrder();
@@ -64,9 +62,11 @@ router.post("/key/create", (req, res) => {
       });
     })
     .catch((reason) => {
-      res.status(403).json({
-        code: 403,
-        error: "Cannot create Order for given Key",
+      res.status(423).json({
+        code: 423,
+        error: reason,
+        key: key.get_key(),
+        charged: 0
       });
     });
 });
@@ -115,7 +115,7 @@ router.post("/key/:key/discharge", (req, res) => {
     });
 });
 
-router.post("/key/:key/charge", (req, res) => {
+router.post("/key/:key/charge", async (req, res) => {
   let amount = req.body.amount;
   if (!amount) {
     // If amount is not given but price is
@@ -137,24 +137,27 @@ router.post("/key/:key/charge", (req, res) => {
   /**
    * @type {Order}
    */
+  let key = await Key.GET_KEY(req.params.key);
   let new_order = null;
-  Order.CREATE_NEW_ORDER(amount, req.params.key, new Manual(note))
+  Order.CREATE_NEW_ORDER(amount, key.get_key(), new Manual(note))
     .then((order) => {
       new_order = order;
       return new_order.captureOrder();
     })
     .then(() => new_order.chargeKey())
-    .then(async () => {
+    .then(() => {
       res.status(201).json({
-        key: await new_order.getKeyFromOrderLink(),
+        key: key.get_key(),
         order_id: new_order.getOrderID(),
         charged: new_order.getAmount(),
       });
     })
     .catch((reason) => {
-      res.status(403).json({
-        code: 403,
-        error: "Cannot create Order for given Key",
+      res.status(423).json({
+        code: 423,
+        error: reason,
+        key: key.get_key(),
+        charged: 0
       });
     });
 });