diff --git a/README.rst b/README.rst
index a5839a12..7f985b28 100644
--- a/README.rst
+++ b/README.rst
@@ -110,7 +110,7 @@ Get table from CARTO, make changes in pandas, sync updates with CARTO:
 .. code:: python
 
     import cartoframes
-    # `base_url`s are of the form `http://{username}.carto.com/` for most users
+    # `base_url`s are of the form `https://{username}.carto.com/` for most users
     cc = cartoframes.CartoContext(base_url='https://eschbacher.carto.com/',
                                   api_key=APIKEY)
 
@@ -194,7 +194,7 @@ CARTO Credential Management
 Typical usage
 ^^^^^^^^^^^^^
 
-The most common way to input credentials into cartoframes is through the `CartoContext`, as below. Replace `{your_user_name}` with your CARTO username and `{your_api_key}` with your API key, which you can find at ``http://{your_user_name}.carto.com/your_apps``.
+The most common way to input credentials into cartoframes is through the `CartoContext`, as below. Replace `{your_user_name}` with your CARTO username and `{your_api_key}` with your API key, which you can find at ``https://{your_user_name}.carto.com/your_apps``.
 
 .. code:: python
 
diff --git a/cartoframes/context.py b/cartoframes/context.py
index c4147ecb..12696c61 100644
--- a/cartoframes/context.py
+++ b/cartoframes/context.py
@@ -136,6 +136,7 @@ class CartoContext(object):
 
     def _is_authenticated(self):
         """Checks if credentials allow for authenticated carto access"""
+        # check if user is authenticated
         try:
             self.sql_client.send(
                 'select * from information_schema.tables limit 0')
diff --git a/cartoframes/credentials.py b/cartoframes/credentials.py
index 4feaecfb..00e7db5e 100644
--- a/cartoframes/credentials.py
+++ b/cartoframes/credentials.py
@@ -1,7 +1,12 @@
 """Credentials management for cartoframes usage."""
 import os
 import json
+import sys
 import warnings
+if sys.version_info >= (3, 0):
+    from urllib.parse import urlparse
+else:
+    from urlparse import urlparse
 import appdirs
 
 _USER_CONFIG_DIR = appdirs.user_config_dir('cartoframes')
@@ -46,26 +51,32 @@ class Credentials(object):
     """
     def __init__(self, creds=None, key=None, username=None, base_url=None,
                  cred_file=None):
+        self._key = None
+        self._username = None
+        self._base_url = None
         if creds and isinstance(creds, Credentials):
-            self._key = creds.key()
-            self._username = creds.username()
-            self._base_url = creds.base_url()
+            self.key(key=creds.key())
+            self.username(username=creds.username())
+            self.base_url(base_url=creds.base_url())
         elif (key and username) or (key and base_url):
-            self._key = key
-            self._username = username
+            self.key(key=key)
+            self.username(username=username)
             if base_url:
-                self._base_url = base_url
+                self.base_url(base_url=base_url)
             else:
-                self._base_url = 'https://{}.carto.com/'.format(self._username)
+                self.base_url(
+                    base_url='https://{}.carto.com/'.format(self._username)
+                )
         elif cred_file:
             self._retrieve(cred_file)
         else:
             try:
                 self._retrieve(_DEFAULT_PATH)
             except:
-                raise RuntimeError('Could not load CARTO credentials. Try '
-                                   'setting them with the `key` and '
-                                   '`username` arguments.')
+                raise RuntimeError(
+                    'Could not load CARTO credentials. Try setting them with '
+                    'the `key` and `username` arguments.'
+                )
         self._norm_creds()
 
     def __repr__(self):
@@ -77,7 +88,8 @@ class Credentials(object):
 
     def _norm_creds(self):
         """Standardize credentials"""
-        self._base_url = self._base_url.strip('/')
+        if self._base_url:
+            self._base_url = self._base_url.strip('/')
 
     def save(self, config_loc=None):
         """Saves current user credentials to user directory.
@@ -256,6 +268,12 @@ class Credentials(object):
                 >>> creds.base_url('new_base_url')
         """
         if base_url:
+            # POSTs need to be over HTTPS (e.g., Import API reverts to a GET)
+            if urlparse(base_url).scheme != 'https':
+                raise ValueError(
+		    '`base_url`s need to be over `https`. Update your '
+                    '`base_url`.'
+		)
             self._base_url = base_url
         else:
             return self._base_url

add base url validation on `https` to ensure all requests occur as expected
`POST api/v1/imports` forwards to `GET api/v1/imports` if the base url is not `https`. This causes some unexpected behaviors and perplexing errors, so we need to add base url validation to ensure all the services work as expected. We can bundle this into the `is_authenticated` method in CartoContext.
diff --git a/test/test_context.py b/test/test_context.py
index dd04ed4c..a8185971 100644
--- a/test/test_context.py
+++ b/test/test_context.py
@@ -167,6 +167,14 @@ class TestCartoContext(unittest.TestCase, _UserUrlLoader):
         cc_saved = cartoframes.CartoContext()
         self.assertEqual(cc_saved.creds.key(), self.apikey)
 
+    @unittest.skipIf(WILL_SKIP, 'no carto credentials, skipping this test')
+    def test_cartocontext_authenticated(self):
+        """context.CartoContext._is_authenticated"""
+        with self.assertRaises(ValueError):
+            cc = cartoframes.CartoContext(
+                base_url=self.baseurl.replace('https', 'http'),
+                api_key=self.apikey)
+
     @unittest.skipIf(WILL_SKIP, 'no carto credentials, skipping this test')
     def test_cartocontext_isorguser(self):
         """context.CartoContext._is_org_user"""
diff --git a/test/test_credentials.py b/test/test_credentials.py
index 5b6f6735..0aeb9ba2 100644
--- a/test/test_credentials.py
+++ b/test/test_credentials.py
@@ -22,10 +22,10 @@ class TestCredentials(unittest.TestCase):
         self.onprem_base_url = 'https://turtleland.com/user/{}'.format(
                 self.username)
         self.default = {
-                'key': 'default_key',
-                'username': 'default_username',
-                'base_url': 'https://default_username.carto.com/'
-                }
+            'key': 'default_key',
+            'username': 'default_username',
+            'base_url': 'https://default_username.carto.com/'
+        }
         self.default_cred = Credentials(**self.default)
         self.default_cred.save()
 
@@ -61,6 +61,12 @@ class TestCredentials(unittest.TestCase):
         self.assertEqual(creds.username(), None)
         self.assertEqual(creds.base_url(), self.base_url.strip('/'))
 
+        with self.assertRaises(ValueError):
+            creds = Credentials(
+                key=self.key,
+                base_url=self.base_url.replace('https', 'http')
+            )
+
     def test_credentials_onprem_baseurl(self):
         """credentials.Credentials on-prem-style base_url"""
         creds = Credentials(key=self.key,

pip install -e .
parse_log_pytest
requirements.txt
pytest geopandas
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
appdirs==1.4.4
attrs==22.2.0
backcall==0.2.0
carto==1.11.3
-e git+https://github.com/CartoDB/cartoframes.git@b45ab4800eef0ef114ad707887833fd028b54b5a#egg=cartoframes
certifi==2021.5.30
charset-normalizer==2.0.12
click==8.0.4
click-plugins==1.1.1
cligj==0.7.2
decorator==5.1.1
Fiona==1.8.22
future==1.0.0
geopandas==0.9.0
idna==3.10
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
ipython==7.16.3
ipython-genutils==0.2.0
jedi==0.17.2
munch==4.0.0
numpy==1.19.5
packaging==21.3
pandas==1.1.5
parso==0.7.1
pexpect==4.9.0
pickleshare==0.7.5
pluggy==1.0.0
prompt-toolkit==3.0.36
ptyprocess==0.7.0
py==1.11.0
Pygments==2.14.0
pyparsing==3.1.4
pyproj==3.0.1
pyrestcli==0.6.11
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
Shapely==1.8.5.post1
six==1.17.0
tomli==1.2.3
tqdm==4.64.1
traitlets==4.3.3
typing_extensions==4.1.1
urllib3==1.26.20
wcwidth==0.2.13
webcolors==1.7
zipp==3.6.0

name: cartoframes
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - appdirs==1.4.4
      - attrs==22.2.0
      - backcall==0.2.0
      - carto==1.11.3
      - charset-normalizer==2.0.12
      - click==8.0.4
      - click-plugins==1.1.1
      - cligj==0.7.2
      - decorator==5.1.1
      - fiona==1.8.22
      - future==1.0.0
      - geopandas==0.9.0
      - idna==3.10
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - ipython==7.16.3
      - ipython-genutils==0.2.0
      - jedi==0.17.2
      - munch==4.0.0
      - numpy==1.19.5
      - packaging==21.3
      - pandas==1.1.5
      - parso==0.7.1
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - pluggy==1.0.0
      - prompt-toolkit==3.0.36
      - ptyprocess==0.7.0
      - py==1.11.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pyproj==3.0.1
      - pyrestcli==0.6.11
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - shapely==1.8.5.post1
      - six==1.17.0
      - tomli==1.2.3
      - tqdm==4.64.1
      - traitlets==4.3.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - wcwidth==0.2.13
      - webcolors==1.7
      - zipp==3.6.0
prefix: /opt/conda/envs/cartoframes

test/test_credentials.py::TestCredentials::test_credentials_baseurl
test/test_context.py::TestCartoContext::test_add_encoded_geom test/test_context.py::TestCartoContext::test_cartocontext test/test_context.py::TestCartoContext::test_cartocontext_authenticated test/test_context.py::TestCartoContext::test_cartocontext_check_query test/test_context.py::TestCartoContext::test_cartocontext_credentials test/test_context.py::TestCartoContext::test_cartocontext_delete test/test_context.py::TestCartoContext::test_cartocontext_handle_import test/test_context.py::TestCartoContext::test_cartocontext_isorguser test/test_context.py::TestCartoContext::test_cartocontext_map test/test_context.py::TestCartoContext::test_cartocontext_map_geom_type test/test_context.py::TestCartoContext::test_cartocontext_map_time test/test_context.py::TestCartoContext::test_cartocontext_mixed_case test/test_context.py::TestCartoContext::test_cartocontext_read test/test_context.py::TestCartoContext::test_cartocontext_table_exists test/test_context.py::TestCartoContext::test_cartocontext_write test/test_context.py::TestCartoContext::test_cartocontext_write_index test/test_context.py::TestCartoContext::test_cartoframes_query test/test_context.py::TestCartoContext::test_cartoframes_sync test/test_context.py::TestCartoContext::test_column_name_collision_do_enrichement test/test_context.py::TestCartoContext::test_data test/test_context.py::TestCartoContext::test_data_boundaries test/test_context.py::TestCartoContext::test_data_discovery test/test_context.py::TestCartoContext::test_debug_print test/test_context.py::TestCartoContext::test_get_bounds test/test_context.py::TestCartoContext::test_write_privacy test/test_context.py::TestBatchJobStatus::test_batchjobstatus test/test_context.py::TestBatchJobStatus::test_batchjobstatus_methods test/test_context.py::TestBatchJobStatus::test_batchjobstatus_repr
test/test_context.py::TestCartoContext::test_cartocontext_send_dataframe test/test_context.py::TestCartoContext::test_decode_geom test/test_context.py::TestCartoContext::test_df2pg_schema test/test_context.py::TestCartoContext::test_dtypes2pg test/test_context.py::TestCartoContext::test_encode_geom test/test_context.py::TestCartoContext::test_pg2dtypes test/test_credentials.py::TestCredentials::test_credentials test/test_credentials.py::TestCredentials::test_credentials_base_url test/test_credentials.py::TestCredentials::test_credentials_constructor test/test_credentials.py::TestCredentials::test_credentials_cred_file test/test_credentials.py::TestCredentials::test_credentials_delete test/test_credentials.py::TestCredentials::test_credentials_invalid_key test/test_credentials.py::TestCredentials::test_credentials_key test/test_credentials.py::TestCredentials::test_credentials_no_args test/test_credentials.py::TestCredentials::test_credentials_onprem_baseurl test/test_credentials.py::TestCredentials::test_credentials_repr test/test_credentials.py::TestCredentials::test_credentials_retrieve test/test_credentials.py::TestCredentials::test_credentials_set test/test_credentials.py::TestCredentials::test_credentials_username
README.rst cartoframes/context.py cartoframes/credentials.py
README.rst cartoframes/context.py cartoframes/credentials.py