diff --git a/config.yml.dist b/config.yml.dist
index ed1c11b..f43407f 100644
--- a/config.yml.dist
+++ b/config.yml.dist
@@ -1,8 +1,6 @@
-#base_url: 'http://sandbox.alt.tf/whois/glanet'
 base_url: 'https://rest.db.ripe.net/ripe'
+# https://apps.db.ripe.net/db-web-ui/api-keys
+username: 'username'
+password: 'password'
 params:
-  password:
-    - 'mnt1-password'
-    - 'mnt2-password'
-    - 'mnt3-password'
   unfiltered: True            # Needed to get all attributes
diff --git a/ripe-api.py b/ripe-api.py
index 039b5cc..736c888 100755
--- a/ripe-api.py
+++ b/ripe-api.py
@@ -9,32 +9,40 @@ import os
 import hashlib
 from subprocess import call
 
-config = os.path.join(os.path.dirname(os.path.realpath(__file__)),"config.yml")
+config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "config.yml")
 
 # Read configuration
-with open(config, 'r') as ymlfile:
+with open(config, "r") as ymlfile:
     cfg = yaml.load(ymlfile, Loader=yaml.FullLoader)
 
 
 # Functions
 def call_api(method, url, object_data=None):
-    headers = { 'Content-Type': 'application/json',
-                'Accept': 'application/json' }
-    response = requests.request(method, url, json=object_data, headers=headers,
-                                params=cfg['params'])
+    headers = {"Content-Type": "application/json", "Accept": "application/json"}
+    auth_basic = requests.auth.HTTPBasicAuth(cfg["username"], cfg["password"])
+    response = requests.request(
+        method,
+        url,
+        json=object_data,
+        headers=headers,
+        params=cfg["params"],
+        auth=auth_basic,
+    )
     if not response.text:
         print("No response received (error %i)" % response.status_code)
         sys.exit(1)
 
-    json_response=json.loads(response.text)
+    json_response = json.loads(response.text)
 
     if "errormessages" in json_response:
-        for err in json_response['errormessages']['errormessage']:
-            if 'args' in err:
-                print(err['text'].replace('\n', ' ').replace('\r', '') \
-                    % tuple([d['value'] for d in err['args']]))
+        for err in json_response["errormessages"]["errormessage"]:
+            if "args" in err:
+                print(
+                    err["text"].replace("\n", " ").replace("\r", "")
+                    % tuple([d["value"] for d in err["args"]])
+                )
             else:
-                print(err['text'])
+                print(err["text"])
 
     return json_response
 
@@ -42,9 +50,8 @@ def call_api(method, url, object_data=None):
 # Print formatted output from JSON
 def print_output(json, object_file):
     if "objects" in json:
-        for attr in json['objects']['object'][0]['attributes']['attribute']:
-            object_file.write("%-20s %s\n" % (attr['name']+':',
-                                              attr['value']))
+        for attr in json["objects"]["object"][0]["attributes"]["attribute"]:
+            object_file.write("%-20s %s\n" % (attr["name"] + ":", attr["value"]))
     if object_file:
         object_file.close()
 
@@ -52,29 +59,24 @@ def print_output(json, object_file):
 def read_input(object_file):
     attr = []
     for line in object_file.readlines():
-        if not line: continue
-        attr.append({'name':line.split(':', 1)[0].strip(),
-                     'value':line.split(':', 1)[1].strip() })
+        if not line:
+            continue
+        attr.append(
+            {
+                "name": line.split(":", 1)[0].strip(),
+                "value": line.split(":", 1)[1].strip(),
+            }
+        )
 
-    object_data = {
-        "objects": {
-            "object": [
-                {
-                    "attributes": {
-                         "attribute": attr
-                    }
-                }
-            ]
-        }
-    }
+    object_data = {"objects": {"object": [{"attributes": {"attribute": attr}}]}}
     return object_data
 
 
 # Get record
 def get(args):
     print("Getting %s object %s" % (args.type, args.key))
-    url = '/'.join((cfg['base_url'],args.type,args.key))
-    json_response=call_api("GET", url)
+    url = "/".join((cfg["base_url"], args.type, args.key))
+    json_response = call_api("GET", url)
     print_output(json_response, args.file)
     return
 
@@ -82,17 +84,17 @@ def get(args):
 # Delete record
 def delete(args):
     print("Deleting %s object %s" % (args.type, args.key))
-    url = '/'.join((cfg['base_url'],args.type,args.key))
-    json_response=call_api("DELETE", url)
+    url = "/".join((cfg["base_url"], args.type, args.key))
+    json_response = call_api("DELETE", url)
     return
 
 
 # Create record
 def create(args):
     print("Creating %s object" % (args.type))
-    url = '/'.join((cfg['base_url'],args.type))
+    url = "/".join((cfg["base_url"], args.type))
     object_data = read_input(args.file)
-    json_response=call_api("POST", url, object_data)
+    json_response = call_api("POST", url, object_data)
     print_output(json_response, sys.stdout)
     return
 
@@ -100,9 +102,9 @@ def create(args):
 # Update record
 def update(args):
     print("Updating %s object %s" % (args.type, args.key))
-    url = '/'.join((cfg['base_url'],args.type,args.key))
+    url = "/".join((cfg["base_url"], args.type, args.key))
     object_data = read_input(args.file)
-    json_response=call_api("PUT", url, object_data)
+    json_response = call_api("PUT", url, object_data)
     print_output(json_response, sys.stdout)
     return
 
@@ -111,11 +113,11 @@ def update(args):
 def edit(args):
     tmp_fd, tmp_name = tempfile.mkstemp()
     get(parser.parse_args(["get", args.type, args.key, tmp_name]))
-    EDITOR = os.environ.get('EDITOR','vim')
+    EDITOR = os.environ.get("EDITOR", "vim")
     # Memory inefficient, but who cares?
-    hash1 = hashlib.md5(open(tmp_name).read().encode('utf-8')).hexdigest()
+    hash1 = hashlib.md5(open(tmp_name).read().encode("utf-8")).hexdigest()
     call([EDITOR, tmp_name])
-    hash2 = hashlib.md5(open(tmp_name).read().encode('utf-8')).hexdigest()
+    hash2 = hashlib.md5(open(tmp_name).read().encode("utf-8")).hexdigest()
 
     if hash1 != hash2:
         update(parser.parse_args(["update", args.type, args.key, tmp_name]))
@@ -125,7 +127,8 @@ def edit(args):
     os.unlink(tmp_name)
     return
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
 
     # Arguments parsing
     # USAGE : ./ripe-api.py delete <TYPE> <KEY>
@@ -133,30 +136,36 @@ if __name__ == '__main__':
     #         ./ripe-api.py update <TYPE> <KEY> <FILE>
     #         ./ripe-api.py get <TYPE> <KEY> <FILE>
     #         ./ripe-api.py edit <TYPE> <KEY>
-    parser = argparse.ArgumentParser(description='RIPE API client')
-    subparsers = parser.add_subparsers(help='Action to perform',dest='action',required=True)
+    parser = argparse.ArgumentParser(description="RIPE API client")
+    subparsers = parser.add_subparsers(
+        help="Action to perform", dest="action", required=True
+    )
 
-    parser_get = subparsers.add_parser('get', help='Get an object')
-    parser_get.add_argument('type', type=str, help='Object type')
-    parser_get.add_argument('key', type=str, help='Object identifier')
-    parser_get.add_argument('file', type=argparse.FileType('w'), help='Output file')
+    parser_get = subparsers.add_parser("get", help="Get an object")
+    parser_get.add_argument("type", type=str, help="Object type")
+    parser_get.add_argument("key", type=str, help="Object identifier")
+    parser_get.add_argument(
+        "file", type=argparse.FileType("w"), help="Output file", nargs="?", default="-"
+    )
 
-    parser_delete = subparsers.add_parser('delete', help='Delete an object')
-    parser_delete.add_argument('type', type=str, help='Object type')
-    parser_delete.add_argument('key', type=str, help='Object identifier')
+    parser_delete = subparsers.add_parser("delete", help="Delete an object")
+    parser_delete.add_argument("type", type=str, help="Object type")
+    parser_delete.add_argument("key", type=str, help="Object identifier")
 
-    parser_post = subparsers.add_parser('create', help='Create an object')
-    parser_post.add_argument('type', type=str, help='Object type')
-    parser_post.add_argument('file', type=argparse.FileType('r'), help='Input file')
+    parser_post = subparsers.add_parser("create", help="Create an object")
+    parser_post.add_argument("type", type=str, help="Object type")
+    parser_post.add_argument(
+        "file", type=argparse.FileType("r"), help="Input file", nargs="?", default="-"
+    )
 
-    parser_put = subparsers.add_parser('update', help='Update an object')
-    parser_put.add_argument('type', type=str, help='Object type')
-    parser_put.add_argument('key', type=str, help='Object identifier')
-    parser_put.add_argument('file', type=argparse.FileType('r'), help='Input file')
+    parser_put = subparsers.add_parser("update", help="Update an object")
+    parser_put.add_argument("type", type=str, help="Object type")
+    parser_put.add_argument("key", type=str, help="Object identifier")
+    parser_put.add_argument("file", type=argparse.FileType("r"), help="Input file")
 
-    parser_edit = subparsers.add_parser('edit', help='Edit an object')
-    parser_edit.add_argument('type', type=str, help='Object type')
-    parser_edit.add_argument('key', type=str, help='Object identifier')
+    parser_edit = subparsers.add_parser("edit", help="Edit an object")
+    parser_edit.add_argument("type", type=str, help="Object type")
+    parser_edit.add_argument("key", type=str, help="Object identifier")
 
     args = parser.parse_args()
     globals()[args.action](args)