diff --git a/server/app.py b/server/app.py
index 12e0acd167faa222badbe586a2a14030e9522b35..746c187d66c511f5b9356fb4c52a59f78a9d0a00 100644
--- a/server/app.py
+++ b/server/app.py
@@ -12,6 +12,15 @@ with open("pizza_types.json","r") as f:
 
 open_carts = {}
 
+def get_cart(uid, key):
+    if uid == None or key == None:
+        return None
+    if uid not in open_carts:
+        return None
+    if open_carts[uid]["key"] != key:
+        return None
+    return open_carts[uid]
+
 @app.route("/")
 def hello_world():
     # Return OK message
@@ -30,9 +39,74 @@ def open_cart():
         cart_id = str(uuid.uuid4())
         if cart_id in open_carts:
             logger.warn("Regenerating UUID for new cart - prev " + cart_id)
+        else:
+            foundunique = True
     cart_key = str(uuid.uuid4())
-    # TODO append cart to list and send to user
-    return "{\"status\":200, \"id\": \"not implemented\", \"key\": \"not implemented\"}", 200
+    # Append cart to list of open carts
+    open_carts[cart_id] = {
+        "key": cart_key,
+        "items": []
+    }
+    logger.debug("Cart created with ID " + cart_id + " and key " + cart_key)
+    return "{\"status\":200, \"id\": \"" + cart_id + "\", \"key\": \"" + cart_key + "\"}", 200
+
+@app.route("/cart/items", methods=["GET"])
+def get_cart_items():
+    # Get cart id and key from request
+    cart_id = request.args.get("id")
+    cart_key = request.args.get("key")
+    # Get cart and verify not none
+    cart = get_cart(cart_id, cart_key)
+    if cart == None:
+        return "{\"status\":403, \"message\": \"invalid cart credentials\"}", 403
+    return "{\"status\":200, \"items\": " + json.dumps(cart["items"]) + "}", 200
 
+@app.route("/cart/add", methods=["POST"])
+def add_cart_item():
+    # Get cart id and key from request
+    cart_id = request.args.get("id")
+    cart_key = request.args.get("key")
+    # Get cart and verify not none
+    cart = get_cart(cart_id, cart_key)
+    if cart == None:
+        return "{\"status\":403, \"message\": \"invalid cart credentials\"}", 403
+    # Get pizza type from request
+    pizza_type = request.args.get("type")
+    if pizza_type == None:
+        return "{\"status\":400, \"message\": \"missing pizza type\"}", 400
+    # Get pizza type from pizza types
+    pizza_type_obj = None
+    for type in pizza_types:
+        if type["id"] == pizza_type:
+            pizza_type_obj = type
+            break
+    if pizza_type_obj == None:
+        return "{\"status\":400, \"message\": \"invalid pizza type\"}", 400
+    # Get number of people from request
+    num_people = request.args.get("num_people")
+    if num_people == None:
+        return "{\"status\":400, \"message\": \"missing number of people\"}", 400
+    # Test for invalid number of people and convert to integer
+    try:
+        num_people = int(num_people)
+    except:
+        return "{\"status\":400, \"message\": \"invalid number of people\"}", 400
+    # Get stuffed crust from request
+    stuffed_crust = request.args.get("stuffed_crust")
+    if stuffed_crust == None:
+        return "{\"status\":400, \"message\": \"missing stuffed crust\"}", 400
+    # Test for invalid stuffed crust and convert to boolean
+    if stuffed_crust == "true":
+        stuffed_crust = True
+    elif stuffed_crust == "false":
+        stuffed_crust = False
+    else:
+        return "{\"status\":400, \"message\": \"invalid stuffed crust\"}", 400
+    cart["items"].append({
+        "type": pizza_type,
+        "num_people": num_people,
+        "stuffed": stuffed_crust
+    })
+    return "{\"status\":200, \"message\": \"ok\", \"items\": " + cart["items"] + "}", 200
 if __name__ == "__main__":
     app.run()
\ No newline at end of file