diff --git a/docs/api.md b/docs/api.md
index a1e41e90905d354d8eeb8e385284c6feefc2b430..80403beb64d00ff1592ac5427d7fffee87ec9cc0 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -53,3 +53,28 @@ Reduces the charge of a key by specified amount
     "discharged": <AMOUNT_DISCHARGED>
 }
 ```
+
+## `POST /api/json/key/:key/charge`
+
+Charges a key by specified amount. Creates a Order to do so. A note can be attached to the Order.  
+`manual` is currently the only valid payment processor for API.
+
+### Parameters
+
+```json
+{
+    "amount": <AMOUNT_TO_CHARGE>
+    "payment_processor": "manual",
+    "note": <NOTE_FOR_ORDER>
+}
+```
+
+### Example Response
+
+```json
+{
+    "key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+    "charge": 100,
+    "discharged": <AMOUNT_DISCHARGED>
+}
+```
\ No newline at end of file
diff --git a/pass/app/Order.js b/pass/app/Order.js
index 91362e2f81c2b7f0978561c26b5f341f383f0fa0..70786be8b7073f03b3455bacd327097ac8f2cad0 100644
--- a/pass/app/Order.js
+++ b/pass/app/Order.js
@@ -296,7 +296,11 @@ class Order {
    * @param {PaymentProcessor} payment_processor
    * @returns
    */
-  static async CREATE_NEW_ORDER(amount, price, key, payment_processor) {
+  static async CREATE_NEW_ORDER(amount, key, payment_processor) {
+    // Calculate price from amount
+    let price = (amount / 300) * config.get("price.per_300");
+    price = price.toFixed(2);
+
     return Order.GENERATE_UNIQUE_ORDER_ID().then((order_id) => {
       let new_order = new Order(order_id, amount, price, payment_processor);
       return new_order
diff --git a/pass/routes/api.js b/pass/routes/api.js
index 07b1b14dad3ec05d043d76d65278de56a1f09bce..adb489426f0696b223c555501f6432dc445595e1 100644
--- a/pass/routes/api.js
+++ b/pass/routes/api.js
@@ -3,6 +3,8 @@ var router = express.Router();
 
 const config = require("config");
 const Key = require("../app/Key");
+const Order = require("../app/Order");
+const Manual = require("../app/payment_processor/Manual");
 
 router.use((req, res, next) => {
     let auth_token = req.get("Authorization");
@@ -50,6 +52,32 @@ router.post("/key/:key/discharge", (req, res) => {
     });
 })
 
+router.post("/key/:key/charge", (req, res) => {
+    let amount = req.body.amount;
+    let payment_processor = "manual"; // Only supported processor via API currently
+    let note = req.body.note;
+
+    /**
+     * @type {Order}
+     */
+    let new_order = null;
+    Order.CREATE_NEW_ORDER(
+        amount,
+        req.params.key,
+        new Manual(note)
+    ).then(order => {
+        new_order = order;
+        return new_order.captureOrder();
+    }).then(() => new_order.chargeKey())
+        .then(async () => {
+            res.json({
+                key: await new_order.getKeyFromOrderLink(),
+                order_id: new_order.getOrderID(),
+                charged: new_order.getAmount(),
+            });
+        });
+});
+
 router.use((req, res) => {
     res.status(404).json({
         code: 404,
diff --git a/pass/routes/checkout/manual.js b/pass/routes/checkout/manual.js
index a805e5e9b5294f831a2e01491bea1f8078d135b8..d7a90aa47c41ccb5a5cf7214035bc85b9f882f13 100644
--- a/pass/routes/checkout/manual.js
+++ b/pass/routes/checkout/manual.js
@@ -30,7 +30,6 @@ router.post("/", (req, res) => {
     let new_order = null;
     Order.CREATE_NEW_ORDER(
         req.params.amount,
-        (req.params.amount / 300) * config.get("price.per_300"),
         req.data.key.key.get_key(),
         new Manual(req.body.note))
         .then(order => {
diff --git a/pass/routes/checkout/paypal.js b/pass/routes/checkout/paypal.js
index 21ff59842a17358852a9eb9c698d4d5783f6ff09..afca4a78e371ecefa1fa8c06761ed121dc46947b 100644
--- a/pass/routes/checkout/paypal.js
+++ b/pass/routes/checkout/paypal.js
@@ -60,7 +60,6 @@ router.post("/:funding_source/order/create", async (req, res) => {
   Order.CREATE_NEW_ORDER(
     // Create Order on our side
     req.params.amount,
-    (req.params.amount / 300) * config.get("price.per_300"),
     req.data.key.key.get_key(),
     new Paypal()
   )