Simple Maps
A Python client and CLI for Cartes.io, a free and open-source mapping platform.
Create interactive maps with markers directly from Python code or the command line.
✨ Features
- Full API Coverage - Maps, markers, categories, users, and more
- CLI & Library - Use from the terminal or import in your Python code
- Zero Config - Works out of the box, no API key needed for public maps
📦 Installation
pip install simple-maps
Or with uv:
uv add simple-maps
🚀 Quick Start
Python API
from simple_maps import Cartes, MapCreatePayload, MarkerCreatePayload, Privacy
# Initialize the client
api = Cartes()
# Create a new map
response = api.map_create(MapCreatePayload(
title="Coffee Shops in NYC",
description="My favorite places to grab coffee",
privacy=Privacy.PUBLIC,
))
map_id = response["uuid"]
map_token = response["token"] # Save this to edit the map later
# Add a marker
api.marker_create(map_id, MarkerCreatePayload(
map_token=map_token,
lat=40.7128,
lng=-74.0060,
category_name="Coffee",
description="Best espresso in Manhattan",
))
# List all public maps
maps = api.map_list()
Command Line
# Create a map
simple_maps map create --title "My Map" --privacy public
# Get map details
simple_maps map get --map-id <UUID>
# Add a marker
simple_maps marker create \
--map-id <UUID> \
--map-token <TOKEN> \
--lat 40.7128 \
--lng -74.0060 \
--category-name "Location" \
--description "A point of interest"
# List markers on a map
simple_maps marker list --map-id <UUID>
# Search for maps
simple_maps map search --query "coffee"
📖 CLI Reference
Map Commands
| Command | Description |
|---|---|
map list |
List all public maps |
map search --query TEXT |
Search maps by keyword |
map get --map-id UUID |
Get details of a specific map |
map create [OPTIONS] |
Create a new map |
map edit --map-id UUID --token TOKEN [OPTIONS] |
Edit an existing map |
map delete --map-id UUID --token TOKEN |
Delete a map |
map claim --map-id UUID --token TOKEN --api-key KEY |
Claim anonymous map ownership |
map static-image --map-id UUID |
Get static image URL for a map |
Marker Commands
| Command | Description |
|---|---|
marker list --map-id UUID |
List all markers on a map |
marker create --map-id UUID --map-token TOKEN --lat FLOAT --lng FLOAT |
Create a marker |
marker edit --map-id UUID --marker-id ID --token TOKEN |
Edit a marker |
marker delete --map-id UUID --marker-id ID --token TOKEN |
Delete a marker |
marker spam --map-id UUID --marker-id ID |
Report a marker as spam |
Category Commands
| Command | Description |
|---|---|
category list --map-id UUID |
List categories on a map |
category search --query TEXT |
Search categories globally |
category related --category-id ID |
Get related categories |
User Commands
| Command | Description |
|---|---|
user list |
List all users |
user get --username TEXT |
Get user profile |
me get --api-key KEY |
Get authenticated user info |
me update --api-key KEY [OPTIONS] |
Update your profile |
🔧 API Reference
Models
All request payloads use Pydantic models with built-in validation:
from simple_maps import (
MapCreatePayload, # Create/edit maps
MapListParams, # Filter map listings
MarkerCreatePayload, # Create markers (validates coordinates)
MarkerLocationPayload, # Add location history to markers
Privacy, # PUBLIC, UNLISTED, PRIVATE
Permission, # YES, NO, LOGGED
)
Cartes Client Methods
api = Cartes(base_url="https://cartes.io/api") # Custom base URL optional
# Maps
api.map_list(params=None, api_key=None)
api.map_search(query, api_key=None)
api.map_get(map_uuid, api_key=None)
api.map_create(payload=None, api_key=None)
api.map_edit(map_token, map_id, payload, api_key=None)
api.map_delete(map_token, map_id, api_key=None)
# Markers
api.marker_list(map_id, show_expired=None, response_format=None, api_key=None)
api.marker_create(map_id, payload, api_key=None)
api.marker_edit(marker_token, map_id, marker_id, description=None, api_key=None)
api.marker_delete(marker_token, map_id, marker_id, api_key=None)
# Categories
api.category_list(map_id, api_key=None)
api.category_search(query, api_key=None)
api.category_related(category_id, api_key=None)
# Users
api.user_list(api_key=None)
api.user_get(username, with_maps=None, with_markers=None, api_key=None)
api.me_get(api_key)
api.me_update(api_key, username=None, description=None)
🛡️ Validation
Pydantic validates all inputs automatically:
from simple_maps import MarkerCreatePayload
from pydantic import ValidationError
try:
# This will raise ValidationError - latitude must be between -90 and 90
MarkerCreatePayload(
map_token="token",
lat=200.0, # Invalid!
lng=0.0,
category=1,
)
except ValidationError as e:
print(e)
# lat: Input should be less than or equal to 90
🔗 Links
- Cartes.io - The mapping platform
- Cartes.io API Docs - Official API documentation
- GitHub Repository - Source code
- PyPI Package - Python package
📄 License
MIT License - see LICENSE for details.
Metadata
Release files for simple-maps 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simple_maps-0.2.0.tar.gz | 12.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| simple_maps-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.0 kB
Release files / simple_maps-0.2.0.tar.gz
| Download URL | simple_maps-0.2.0.tar.gz |
|---|---|
| Size | 12.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
305dbd783aaf9bbe9e71083449af736cbcb07549cd9ad16ccbc5d87d8f968ae0
|
|
BLAKE2b-256 checksum How to use checksums |
417eeda214bb67de8296f71b5211787f6c61f5c3590c5b08a2a0511061706532
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 1, 2026.
Transparency logRelease files / simple_maps-0.2.0-py3-none-any.whl
| Download URL | simple_maps-0.2.0-py3-none-any.whl |
|---|---|
| Size | 14.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
65621885e593368d14265459c18e9cf4d9deffeacf4e71608c94489905678845
|
|
BLAKE2b-256 checksum How to use checksums |
23c27ad99f10ee02ec44bc9807e7c72a8970255ed8842aefe1ebf72d4b16bf8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 1, 2026.
Transparency log