Programmatic API Reference¶
Use vresto's Python API to automate satellite data searches and downloads in your applications.
Installation¶
pip install vresto
# or with uv
uv pip install vresto
Configuration¶
Set credentials via environment variables:
export COPERNICUS_USERNAME="your_email@example.com"
export COPERNICUS_PASSWORD="your_password"
export COPERNICUS_S3_ACCESS_KEY="your_s3_access_key" # Optional for downloads
export COPERNICUS_S3_SECRET_KEY="your_s3_secret_key" # Optional for downloads
Or create .env file in your project:
COPERNICUS_USERNAME=your_email@example.com
COPERNICUS_PASSWORD=your_password
COPERNICUS_S3_ACCESS_KEY=your_s3_access_key
COPERNICUS_S3_SECRET_KEY=your_s3_secret_key
⚠️ Important: S3 Credentials¶
Without static S3 credentials, vresto will auto-generate temporary credentials with strict usage limits. These temporary credentials have limited quotas and will be exhausted quickly with large downloads.
To avoid hitting quota restrictions, it's highly recommended to request your own permanent S3 credentials from Copernicus Dataspace and add them to your environment.
Core Classes¶
CatalogSearch¶
Search for Sentinel-2 products in a bounding box.
from vresto.api import BoundingBox, CatalogSearch, CopernicusConfig
config = CopernicusConfig()
catalog = CatalogSearch(config=config)
bbox = BoundingBox(west=4.65, south=50.85, east=4.75, north=50.90)
products = catalog.search_products(
bbox=bbox,
start_date="2024-01-01",
end_date="2024-01-31",
max_cloud_cover=20,
)
for product in products:
print(f"{product.name} - Cloud: {product.cloud_cover}%")
Search Parameters:
- bbox: BoundingBox (geographic area)
- start_date: Start date (YYYY-MM-DD)
- end_date: End date (YYYY-MM-DD, optional)
- max_cloud_cover: Max cloud coverage (0-100%, optional)
ProductsManager¶
Single manager for all product downloads: quicklooks, metadata, and spectral bands.
from vresto.products import ProductsManager
manager = ProductsManager(config=config)
# Download preview image
quicklook = manager.get_quicklook(product)
if quicklook:
quicklook.save_to_file("preview.jpg")
# Download metadata XML file
metadata = manager.get_metadata(product)
if metadata:
metadata.save_to_file("metadata.xml")
# Download spectral bands (B02, B03, B04, etc.)
files = manager.download_product_bands(
product,
bands=['B02', 'B03', 'B04'], # Red, Green, Blue
resolution=10, # meters
dest_dir='./data'
)
Methods:
- get_quicklook(product) → JPEG preview
- get_metadata(product) → XML metadata file
- download_product_bands(product, bands, resolution, dest_dir) → GeoTIFF band files
- batch_get_quicklooks(products) → Multiple previews
- batch_get_metadata(products) → Multiple metadata files
Complete Examples¶
Example 1: Search and Download Quicklooks¶
from vresto.api import BoundingBox, CatalogSearch, CopernicusConfig
from vresto.products import ProductsManager
# Setup
config = CopernicusConfig()
catalog = CatalogSearch(config=config)
manager = ProductsManager(config=config)
# Search
bbox = BoundingBox(west=4.65, south=50.85, east=4.75, north=50.90)
products = catalog.search_products(
bbox=bbox,
start_date="2024-01-01",
end_date="2024-01-07",
max_cloud_cover=20,
)
print(f"Found {len(products)} products")
# Download quicklooks for first 5
for product in products[:5]:
quicklook = manager.get_quicklook(product)
if quicklook:
quicklook.save_to_file(f"quicklooks/{product.name}.jpg")
print(f"✅ {product.name}")
Example 2: Download Spectral Bands¶
Download individual spectral bands (B02=Blue, B03=Green, B04=Red) as GeoTIFF files.
The download_product_bands() method accepts three input formats:
# Option 1: From catalog search results (ProductInfo object)
# Contains metadata: name, s3_path, cloud_cover, sensing_date, etc.
product = products[0] # ProductInfo object from search
files = manager.download_product_bands(
product,
bands=['B02', 'B03', 'B04'], # Blue, Green, Red (RGB)
resolution=10, # 10-meter resolution
dest_dir='./data'
)
# Option 2: Using short product name string (most user-friendly)
# Just the product name, no need for catalog search
files = manager.download_product_bands(
"S2B_MSIL2A_20201212T235129_N0500_R073_T59UNV_20230226T030207",
bands=['B02', 'B03', 'B04'],
resolution=10,
dest_dir='./data'
)
# Option 3: Using full S3 path string
files = manager.download_product_bands(
"s3://eodata/Sentinel-2/MSI/L2A_N0500/2020/12/12/S2B_MSIL2A_20201212T235129_N0500_R073_T59UNV_20230226T030207.SAFE/",
bands=['B02', 'B03', 'B04'],
resolution=10,
dest_dir='./data'
)
for filepath in files:
print(f"Downloaded: {filepath}")
Available Bands (Sentinel-2): - 10m: B02 (Blue), B03 (Green), B04 (Red), B08 (NIR) - 20m: B05, B06, B07, B11 (SWIR), B12 (SWIR), B8A (Red Edge), SCL (Scene Classification) - 60m: B01 (Aerosol), B09 (Water Vapor), B10 (Cirrus)
Path Construction (auto-constructs from short name):
Input: S2B_MSIL2A_20201212T235129_N0500_R073_T59UNV_20230226T030207
→ s3://eodata/Sentinel-2/MSI/L2A_N0500/2020/12/12/S2B_MSIL2A_20201212T235129_N0500_R073_T59UNV_20230226T030207.SAFE/
Download Options:
- resolution: 10, 20, 60 (meters) or 'native'
- resample: Auto-resample to target resolution (requires rasterio)
- overwrite: Overwrite existing files
- preserve_s3_structure: Mirror S3 structure locally (default: True)
- With True: ./data/Sentinel-2/MSI/L2A_N0500/2020/12/12/S2B_.../IMG_DATA/T59UNV_20201212T235129_B02_10m.jp2
- With False: ./data/T59UNV_20201212T235129_B02_10m.jp2
Next Steps¶
- Quick Start - Get started quickly
- Web Interface Guide - Visual search interface
- AWS CLI Guide - Direct S3 access