RasterFlow reads and writes directly to S3-compatible locations. Inputs — an Area of Interest, a GDAL Raster Tile Index (GTI), a source Zarr store — are read from the URI you pass in, and every RasterFlow task takes a
storage_uri input that controls where its outputs and intermediate data land.
By default, that destination is your Organization’s Wherobots Managed Storage. Point storage_uri at a Storage Integration instead when you want RasterFlow output to live in your own S3 bucket, under your own retention and access rules.
Where RasterFlow writes
Reading outputs outside Wherobots. A Wherobots notebook can read Managed Storage directly. To read a task’s outputs from your own machine or systems, see Download a task run’s results, or write them to your own bucket with
storage_uri.Before you start
Wherobots requirements
Wherobots requirements
- A Wherobots account. RasterFlow is available to every Organization with nothing to enable.
- Outside a Wherobots notebook or job, a Wherobots API key, set as
WHEROBOTS_API_KEY. - For the Python examples, Python 3.11 or later with
wherobots-python-sdk. The API examples need onlycurl.
Storage requirements
Storage requirements
- A storage integration that is already configured through the normal Wherobots setup flow. See S3 Storage Integration for the guided CloudFormation wizard.
- Read & Write access on the integration if you intend to use the bucket as a RasterFlow destination. A Read integration can supply inputs only.
Runtime Restart Required After Data IntegrationTo use new storage integrations or catalogs in your notebooks, destroy the existing runtime and start a new one.
Notebooks can only access storage integrations or catalogs that were created before the runtime started.
How RasterFlow authenticates to storage
You do not supply an IAM role, an access key, or a credential file to RasterFlow. Access is resolved per path, at the moment the task needs it:Scoped, path-aware credentials
Scoped, path-aware credentials
RasterFlow matches the S3 path it is about to read or write against the storage scopes configured for your Organization, then mints short-lived AWS credentials scoped to that path and to the access mode it needs — read for inputs, read-write for destinations. Credentials are cached and refreshed before they expire, so long-running mosaic and inference tasks keep working without intervention.
Anonymous access to public S3
Anonymous access to public S3
Publicly readable S3 URIs are read anonymously — no storage integration and no Cloud Connection are involved. This is what lets you point
gti_uri or aoi at an open dataset while writing results to your own private bucket.No storage credentials in your code
No storage credentials in your code
Your Wherobots identity authorizes the task run (your API key, or your sign-in inside a Wherobots notebook or job), and RasterFlow resolves storage access on the server. Your code never holds AWS credentials, and the same code runs unchanged from a notebook, a script, or a scheduler.
Credential resolution is automatic, but the integration itself is not. RasterFlow can only reach buckets that an Admin has already added as a storage integration — it will not prompt you to create one.
Set a destination bucket
The examples on this page run RasterFlow through the Tasks API, in two tabs. Python uses the Wherobots Python SDK, and API calls the REST API with
curl. Outside a Wherobots notebook or job, both need a Wherobots API key in WHEROBOTS_API_KEY. Each example starts a task run; to wait for it and read its results, see Get started and Run RasterFlow Tasks.storage_uri as an s3:// URI prefix. RasterFlow writes its outputs and intermediate data under that prefix.
storage_uri: build_mosaics, build_gti_mosaics, run_mosaic_inference, run_cog_inference, the recipe and geometry inference tasks, run_mosaics_change, vectorize_mosaic, and build_zarr_multiscales. Get a task returns each task’s full input schema.
Use different buckets for input and output
storage_uri is set per task run and applies only to that run’s output, so inputs and outputs are independent. A built-in dataset, a public tile index, or a store in a bucket you only read from can each be an input while everything you produce goes to your own bucket.
That holds across the steps of a pipeline too. Each task reads the URI returned by the previous run and writes wherever you send it. This example follows the ChesapeakeRSC recipe: it filters the NAIP tile index for native 1-meter imagery from 2017 and uses a 1-meter output grid. Choose a date range with coverage for your AOI.
Every bucket you reference — whether as an input URI or as a
storage_uri destination — needs to be either publicly readable or covered by a storage integration. Reading from one integrated bucket and writing to another is supported; reading from a bucket that has no integration is not.Supported formats
RasterFlow reads and writes standard open formats at these locations. Supported examples include:Zarr
Zarr
Mosaics, model predictions, and change-detection outputs are written as Zarr stores.
build_zarr_multiscales reads a Zarr store and writes an optimized one.COG
COG
Cloud Optimized GeoTIFFs are read as mosaic inputs through a GDAL Raster Tile Index with the
build_gti_mosaics task.GeoParquet
GeoParquet
Areas of Interest and tile indexes are read as GeoParquet. Mosaic index tables and
vectorize_mosaic results are written as GeoParquet.Parquet
Parquet
Non-spatial tabular inputs and outputs alongside your raster products.
vectorize_mosaic task into an Iceberg table with WherobotsDB, for example in a Managed Catalog on an integrated bucket.
Enable map access to outputs in your bucket
Wherobots-GL — the renderer behind the Wherobots Cloud Map page and the notebookMap widget — loads outputs by URL, in the browser. Outputs in Wherobots Managed Storage work with no extra setup. Outputs in your own bucket have to be reachable with the credentials in play and allow cross-origin browser requests (CORS).
Before you visualize
Confirm that:- The output path points at the intended bucket and AWS region.
- The output objects exist and the identity used for visualization can read them.
- The bucket’s CORS policy allows requests from the Wherobots Cloud origins.
- The policy permits
GETandHEADrequests. - The policy allows the
Rangerequest header and exposes theETagandContent-Rangeresponse headers. Wherobots-GL uses partial reads to stream raster data efficiently rather than downloading whole stores.
Validate access
Two different things have to be true, and they are checked separately:Integration access
Integration access
Go to Organization Settings > Storage and use … > Verify Access. Wherobots checks read access, and write access for a Read & Write integration.This confirms RasterFlow can reach the bucket. It exercises the storage integration, not the browser.
Browser CORS access
Browser CORS access
Verify Access does not test the cross-origin path, so a bucket that verifies cleanly can still fail to render. Confirm CORS by opening the output URL on the Map page — a CORS failure shows up as a blank layer and a blocked request in your browser’s developer console.
Troubleshooting visualization
CORS error or blank layer
CORS error or blank layer
Cause: The browser is blocked from reading the output.Solution:
- Update the bucket’s CORS policy using Setting up CORS, then retry.
- Confirm the policy includes the Wherobots Cloud origins,
GETandHEADmethods,Rangeas an allowed request header, andETagandContent-Rangeamong the exposed response headers.
AWS region error
AWS region error
Cause: The output location and the bucket’s region do not match, or the bucket is configured for a different region than expected.Solution:
- Verify the output location, bucket name, and AWS region.
- Re-run the task with a corrected
storage_uri, or republish the output to a bucket in the expected region.
Access denied or object not found
Access denied or object not found
Cause: The output is not where you think it is, or the identity used for visualization cannot read it.Solution:
- Print the output URI from the run’s
resultsrather than reconstructing the path by hand. - Confirm the identity used for visualization has read access to that prefix.
- Do not put long-lived cloud access keys into browser-based configuration. Use short-lived credentials or scoped access instead — in a notebook, pass them with
Map(..., aws_credentials={...})as shown in Visualize RasterFlow Outputs.
Security guidance
Grant only the minimum permissions needed to read the output objects. Keep write and administrative permissions out of anything browser-accessible, and scope temporary credentials to the relevant bucket and prefix.Download task run results
To download a task’s output to your machine with only your API key, request short-lived, read-only AWS credentials for its URI, then copy it. This works for any RasterFlow task, whether the output is a single file, such as a mosaic index, or a directory, such as vector results.Python
- The credentials cover only that output’s prefix and expire after about an hour. Request new ones for each output.
- Zarr stores (
output_urifrom Build Multiscales) can be large. To read part of one instead of copying all of it, pass the samefsto your reader, such asxarray.open_zarr(fs.get_mapper(output_uri)). - With the REST API,
POST https://api.cloud.wherobots.com/storage/credentialswith{"path": "<output URI>", "access_mode": "read"}returns the same credentials.
Troubleshooting
A task run fails on a bucket you can see in Wherobots Cloud
A task run fails on a bucket you can see in Wherobots Cloud
Cause: The integration exists but does not grant the access the task needs. The run’s
error_message (errorMessage in the REST API) names the path it could not reach.Solution:- Confirm the integration is Read & Write if you are using the bucket as a
storage_uridestination. A Read integration cannot receive output. - If you read the outputs from a notebook, start a new runtime. Notebooks can only reach integrations that existed when the runtime started.
- Re-verify the integration from Organization Settings > Storage using … > Verify Access.
You can't read a task's outputs outside Wherobots
You can't read a task's outputs outside Wherobots
Cause: The task ran without
storage_uri, so its output is in Wherobots Managed Storage, which your own AWS credentials can’t read.Solution:- Read the output from a Wherobots notebook, or open it on the Map page.
- Download the existing output with temporary storage credentials. For future runs, set
storage_urito a bucket you can read if you want the outputs there.
An input URI cannot be read
An input URI cannot be read
Cause: The bucket is private and has no storage integration, so RasterFlow falls back to anonymous access and is denied.Solution:
- Add a storage integration for the bucket, or copy the input into a bucket that already has one.
- Verify the URI itself, including any
.zarror.parquetsuffix, by printing it before the call.
Bucket path is rejected
Bucket path is rejected
Cause: The bucket name contains periods, which storage integrations do not support.Solution:
- Use a bucket whose name has no periods —
s3://my-bucketrather thans3://my.bucket.name. See Limitations.
Usage and best practices
- Do
- Don't
- Choose where to store outputs: You can download Managed Storage results with temporary credentials. Set
storage_uriwhen you want future outputs in your own bucket. - Separate prefixes by stage: Distinct prefixes for mosaics, predictions, and vectors make outputs easy to find and easy to expire independently.
- Read public imagery directly: Anonymous access means there is no reason to copy an open dataset into your bucket before mosaicking it.
- Parameterize the destination: Reading
storage_urifrom configuration keeps one script usable across environments. - Set CORS once, up front: Add the CORS policy when you add the storage integration, so outputs are viewable on the map the first time you open one.
Next steps
Set up S3 Storage Integration
Create the integration that grants Wherobots access to your bucket.
Run a task
See the full request and response for starting a RasterFlow task run.
Build Multiscales
Add overview levels to a Zarr store so it can be visualized interactively.
API reference
For detailed API documentation, see:- Run a task -
POST /tasks/{taskName}/runs - Get a task run - state, results, and errors
- Wherobots Python SDK -
wb.tasksandwb.task_runs

