Search the files in your S3, R2 or B2 bucket
Your data can stay in your own bucket, on AWS or any S3-compatible store. Import CSV, NDJSON and Parquet from it with one call, search it by text, regex, filters and vectors, and send query answers back into it as files.
In: a file, a prefix or a pattern
Files are read in key order with your keys, the next one downloading while the current one is parsed. Each becomes searchable all at once; a failure says which file and where to go on.
# every Parquet file under a prefix, from Cloudflare R2 curl -s https://api.skimmerdb.com/v1/namespaces/events/import/bucket \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{ "path": "s3://events/2026/10/*.parquet", "id": "event_id", "text": ["message"], "s3": {"endpoint": "https://<account-id>.r2.cloudflarestorage.com", "region": "auto", "access_key_id": "...", "secret_access_key": "..."}}' # {"files": [...], "rows": 1000000, "next": "", "created": true, ...}
Out: answers as files in your bucket
A SQL export as CSV, NDJSON or Parquet goes straight into your bucket by multipart upload. Nothing is kept on our side, and DuckDB, pandas or Spark read the Parquet as is.
# a query's answer as Parquet, delivered into your Backblaze B2 bucket
curl -s https://api.skimmerdb.com/v1/sql/exports \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{
"sql": "SELECT * FROM events WHERE level = '\''error'\''",
"format": "parquet",
"destination": {"path": "s3://reports/errors-october.parquet",
"s3": {"endpoint": "https://s3.us-west-004.backblazeb2.com", "region": "us-west-004",
"access_key_id": "...", "secret_access_key": "..."}}}'Where it works
Any S3-compatible service with path-style requests. Its endpoint and region go in the s3 object.
| Service | endpoint | region |
|---|---|---|
| AWS S3 | leave endpoint out | the bucket’s region |
| Cloudflare R2 | https://<account-id>.r2.cloudflarestorage.com | auto |
| Backblaze B2 | https://s3.<region>.backblazeb2.com | e.g. us-west-004 |
| Wasabi | https://s3.<region>.wasabisys.com | e.g. us-east-1 |
| DigitalOcean Spaces | https://<region>.digitaloceanspaces.com | e.g. nyc3 |
| Google Cloud Storage | https://storage.googleapis.com (HMAC keys) | auto |
| MinIO, self-hosted | your server’s https address | often us-east-1 |
The same s3 object also lets a DuckLake sync read a lake whose files live on any of these.
Questions
Which storage services work?
AWS S3 and any service that speaks the S3 API with path-style requests and Signature Version 4: Cloudflare R2, Backblaze B2, Wasabi, DigitalOcean Spaces, Google Cloud Storage’s XML API and MinIO among them. Give the service’s endpoint and region in the s3 object.
Are my keys stored?
No. They come with the request (or the export) and are dropped when it ends. Use keys limited to one bucket: read-only for imports, read and write for exports.
How much can one import take?
Up to 100 files and 4 GB a request, each file up to 2 GB. The answer’s next names where to go on; the Python and TypeScript helpers follow it until every file is in. Each file becomes visible all at once.
Does an export to my bucket leave a copy here?
No. The file is written straight into your bucket by multipart upload and nothing is kept on our side. The keys are checked before the export starts, and a failed export aborts its upload.
Can I reach a bucket on a private network?
No. The endpoint must resolve to a public address; private, loopback, link-local and cloud metadata addresses are refused, and the connection goes to the address that was checked.
Bring your bucket
Free up to 1 GB stored and 100k queries a month. No card to start.