diff --git a/.travis.yml b/.travis.yml
index d99e41d..e323672 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,6 +15,7 @@ env:
 install:
   - pip install -U pip --cache-dir $HOME/.pip-cache
   - pip install -e .[test] --cache-dir $HOME/.pip-cache
+  - if [[ $TRAVIS_PYTHON_VERSION == 2.6 ]]; then pip install ordereddict; fi
 script:
   - py.test --cov mapbox --cov-report term-missing
   - py.test --doctest-glob='*.md' docs/*.md
diff --git a/README.rst b/README.rst
index 61fc790..e15a4c9 100644
--- a/README.rst
+++ b/README.rst
@@ -31,6 +31,11 @@ Services
   - Forward (place names ⇢ longitude, latitude)
   - Reverse (longitude, latitude ⇢ place names)
 
+- `Static Maps <https://www.mapbox.com/developers/api/static/>`__
+
+  - Generate standalone images from existing Mapbox mapids
+  - Render with GeoJSON overlays
+
 - `Surface <https://www.mapbox.com/developers/api/surface/>`__
 
   - Interpolates values along lines. Useful for elevation traces.
@@ -138,6 +143,20 @@ which returns::
     
 See ``import mapbox; help(mapbox.Distance)`` for more detailed usage.
 
+Static Maps
+-----------
+Static maps are standalone images that can be displayed on web and mobile devices without the aid of a mapping library or API. Static maps can display GeoJSON overlays and the `simplestyle-spec <https://github.com/mapbox/simplestyle-spec>`_ styles will be respected and rendered.
+
+.. code:: python
+
+    from mapbox import Static
+    res = Static().image('mapbox.satellite',
+                         lon=-61.7, lat=12.1, z=12,
+                         features=list_of_points)
+
+    with open('map.png', 'wb') as output:
+        output.write(res.content)
+
 
 Surface
 -------
diff --git a/mapbox/__init__.py b/mapbox/__init__.py
index 5743280..5decf79 100644
--- a/mapbox/__init__.py
+++ b/mapbox/__init__.py
@@ -7,3 +7,4 @@ from .services.distance import Distance
 from .services.geocoding import Geocoder, InvalidPlaceTypeError
 from .services.surface import Surface
 from .services.uploads import Uploader
+from .services.static import Static
diff --git a/mapbox/services/static.py b/mapbox/services/static.py
new file mode 100644
index 0000000..8e9febe
--- /dev/null
+++ b/mapbox/services/static.py
@@ -0,0 +1,58 @@
+import json
+
+from uritemplate import URITemplate
+
+from mapbox.services.base import Service
+
+
+class Static(Service):
+
+    def __init__(self, access_token=None):
+        self.baseuri = 'https://api.mapbox.com/v4'
+        self.session = self.get_session(access_token)
+
+    def image(self, mapid, lon=None, lat=None, z=None, features=None,
+              width=600, height=600, image_format='png256'):
+
+        if lon and lat and z:
+            auto = False
+        else:
+            auto = True
+
+        values = dict(
+            mapid=mapid,
+            lon=str(lon),
+            lat=str(lat),
+            z=str(z),
+            width=str(width),
+            height=str(height),
+            format=image_format)
+
+        if features:
+            values['overlay'] = json.dumps({'type': 'FeatureCollection',
+                                            'features': features})
+
+            if len(values['overlay']) > 4087:  # limit is 4096 minus the 'geojson()'
+                raise ValueError("geojson is too large for the static maps API, "
+                                 "must be less than 4096 characters")
+
+            if auto:
+                uri = URITemplate(
+                    '%s/{mapid}/geojson({overlay})/auto/{width}x{height}.{format}' %
+                    self.baseuri).expand(**values)
+            else:
+                uri = URITemplate(
+                    '%s/{mapid}/geojson({overlay})/{lon},{lat},{z}/{width}x{height}.{format}' %
+                    self.baseuri).expand(**values)
+        else:
+            if auto:
+                raise ValueError("Must provide features if lat, lon, z are None")
+
+            # No overlay
+            uri = URITemplate(
+                '%s/{mapid}/{lon},{lat},{z}/{width}x{height}.{format}' %
+                self.baseuri).expand(**values)
+
+        res = self.session.get(uri)
+        self.handle_http_error(res)
+        return res

Static Map API
diff --git a/tests/test_staticmaps.py b/tests/test_staticmaps.py
new file mode 100644
index 0000000..548ab2f
--- /dev/null
+++ b/tests/test_staticmaps.py
@@ -0,0 +1,99 @@
+import json
+
+try:
+    from urllib import quote
+except ImportError:
+    # python 3
+    from urllib.parse import quote
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    # python 2.6
+    from ordereddict import OrderedDict
+
+import pytest
+import responses
+
+import mapbox
+
+
+@pytest.fixture
+def points():
+    points = [
+        OrderedDict(
+            type="Feature",
+            properties=OrderedDict(title="point1"),
+            geometry=OrderedDict(
+                type="Point",
+                coordinates=[-61.7, 12.1])),
+        OrderedDict(
+            type="Feature",
+            properties=OrderedDict(title="point2"),
+            geometry=OrderedDict(
+                type="Point",
+                coordinates=[-61.6, 12.0]))]
+
+    return points
+
+
+@responses.activate
+def test_staticmap_lonlatz_only():
+
+    responses.add(
+        responses.GET,
+        'https://api.mapbox.com/v4/mapbox.satellite/-61.7,12.1,12/600x600.png256?access_token=pk.test',
+        match_querystring=True,
+        body='png123',
+        status=200,
+        content_type='image/png')
+
+    res = mapbox.Static(access_token='pk.test').image('mapbox.satellite', -61.7, 12.1, 12)
+    assert res.status_code == 200
+
+
+@responses.activate
+def test_staticmap_lonlatz_features(points):
+
+    overlay = json.dumps({'type': 'FeatureCollection',
+                          'features': points})
+    overlay = quote(overlay)
+    url = ('https://api.mapbox.com/v4/mapbox.satellite/geojson({0})/'
+           '-61.7,12.1,12/600x600.png256?access_token=pk.test'.format(overlay))
+
+    responses.add(
+        responses.GET, url,
+        match_querystring=True,
+        body='png123',
+        status=200,
+        content_type='image/png')
+
+    res = mapbox.Static(access_token='pk.test').image('mapbox.satellite',
+                                                          -61.7, 12.1, 12,
+                                                          points)
+    assert res.status_code == 200
+
+@responses.activate
+def test_staticmap_auto_features(points):
+
+    overlay = json.dumps({'type': 'FeatureCollection',
+                          'features': points})
+    overlay = quote(overlay)
+    url = ('https://api.mapbox.com/v4/mapbox.satellite/geojson({0})/'
+           'auto/600x600.png256?access_token=pk.test'.format(overlay))
+
+    responses.add(
+        responses.GET, url,
+        match_querystring=True,
+        body='png123',
+        status=200,
+        content_type='image/png')
+
+    res = mapbox.Static(access_token='pk.test').image('mapbox.satellite',
+                                                          features=points)
+    assert res.status_code == 200
+
+
+def test_staticmap_auto_nofeatures(points):
+    with pytest.raises(ValueError):
+        mapbox.Static(access_token='pk.test').image('mapbox.satellite')

pip install -e .[test]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
boto3==1.37.23
botocore==1.37.23
cachetools==5.5.2
certifi==2025.1.31
chardet==5.2.0
charset-normalizer==3.4.1
click==8.1.8
click-plugins==1.1.1
cligj==0.7.2
colorama==0.4.6
coverage==7.8.0
coveralls==4.0.1
distlib==0.3.9
docopt==0.6.2
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
filelock==3.18.0
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jmespath==1.0.1
-e git+https://github.com/mapbox/mapbox-sdk-py.git@ab45a8e1a40b5ecbe9e6c59002883e291856dcc9#egg=mapbox
packaging @ file:///croot/packaging_1734472117206/work
platformdirs==4.3.7
pluggy @ file:///croot/pluggy_1733169602837/work
pyproject-api==1.9.0
pytest @ file:///croot/pytest_1738938843180/work
pytest-cov==6.0.0
python-dateutil==2.9.0.post0
PyYAML==6.0.2
requests==2.32.3
responses==0.25.7
s3transfer==0.11.4
six==1.17.0
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
uritemplate==4.1.1
uritemplate.py==3.0.2
urllib3==1.26.20
virtualenv==20.29.3

name: mapbox-sdk-py
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
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - 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=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - boto3==1.37.23
      - botocore==1.37.23
      - cachetools==5.5.2
      - certifi==2025.1.31
      - chardet==5.2.0
      - charset-normalizer==3.4.1
      - click==8.1.8
      - click-plugins==1.1.1
      - cligj==0.7.2
      - colorama==0.4.6
      - coverage==7.8.0
      - coveralls==4.0.1
      - distlib==0.3.9
      - docopt==0.6.2
      - filelock==3.18.0
      - idna==3.10
      - jmespath==1.0.1
      - platformdirs==4.3.7
      - pyproject-api==1.9.0
      - pytest-cov==6.0.0
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.2
      - requests==2.32.3
      - responses==0.25.7
      - s3transfer==0.11.4
      - six==1.17.0
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - uritemplate==4.1.1
      - uritemplate-py==3.0.2
      - urllib3==1.26.20
      - virtualenv==20.29.3
prefix: /opt/conda/envs/mapbox-sdk-py

tests/test_staticmaps.py::test_staticmap_lonlatz_only tests/test_staticmaps.py::test_staticmap_lonlatz_features tests/test_staticmaps.py::test_staticmap_auto_features tests/test_staticmaps.py::test_staticmap_auto_nofeatures
README.rst .travis.yml mapbox/__init__.py mapbox/services/static.py
README.rst .travis.yml mapbox/__init__.py mapbox/services/static.py