Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.bytestack.com/llms.txt

Use this file to discover all available pages before exploring further.

ByteStack can automatically write each job run’s results to your own S3-compatible bucket, giving you full control over data retention, access, and downstream processing. Once configured, results are pushed to your bucket after every run in addition to being available through ByteStack’s built-in storage API.
ByteStack’s built-in storage retains result files until you explicitly delete them. Raw scrape logs are automatically purged after 90 days. If you need longer retention or want to pipe results into your own data pipeline, connect your own bucket using the steps below.

Configuring your bucket

1

Open storage settings

In the ByteStack dashboard, go to Settings → Storage → Connect Bucket.
2

Enter your bucket details

Provide the following details for your bucket:
FieldDescription
EndpointThe S3-compatible endpoint URL (e.g. https://s3.us-east-1.amazonaws.com for AWS, https://<account>.r2.cloudflarestorage.com for Cloudflare R2).
Bucket nameThe name of the bucket to write results into.
Access keyYour storage access key ID.
Secret keyYour storage secret access key.
3

Save and verify

Click Save. ByteStack performs a test write to confirm credentials and permissions. You will see a confirmation message when the connection is active.

Supported providers

ByteStack is compatible with any S3-compatible object store. Tested providers include:

AWS S3

The original S3 API. Use your region-specific endpoint, e.g. https://s3.us-east-1.amazonaws.com.

Cloudflare R2

Zero egress fees. Endpoint format: https://<account_id>.r2.cloudflarestorage.com.

MinIO

Self-hosted S3-compatible storage. Use your MinIO server’s URL as the endpoint.

Backblaze B2

Cost-effective object storage. Use the S3-compatible endpoint from your B2 bucket settings.

File format and naming

ByteStack writes one JSON file per job run. Files are named using the following pattern:
{job_id}/{run_timestamp}.json
For example:
job_01hx9jk2p4n5m6r7s8t9u0v1w/2026-04-30T08:00:00Z.json
Each file contains the full result payload:
{
  "job_id": "job_01hx9jk2p4n5m6r7s8t9u0v1w",
  "run_id": "run_01hx9jk2p4n5m6r7s8t9u0v1x",
  "prompt": "How many times was Acme mentioned on X today?",
  "sources": ["x"],
  "completed_at": "2026-04-30T08:01:22Z",
  "result": {
    "summary": "Acme was mentioned 342 times on X today, with 71% positive sentiment.",
    "total_results": 342,
    "records": []
  }
}

Accessing files from the dashboard

All result files — both from ByteStack’s built-in storage and from your connected bucket — are visible in the Storage tab of your project workspace. Click any file to preview its content or download it directly.

Downloading via the API

You can list and download result files programmatically using the ByteStack storage endpoints, regardless of whether you have connected your own bucket.
import json
from bytestack import ByteStack

client = ByteStack()

# List all result files
files = client.storage.list()
for f in files:
    print(f"{f.key}{f.size_bytes} bytes — {f.created_at}")

# Download and parse the most recent result
latest = files[0]
data = client.storage.download(latest.key)
result = json.loads(data)

print("Summary:", result["result"]["summary"])
print("Total results:", result["result"]["total_results"])

# Process each record
for record in result["result"]["records"]:
    print(record)

Accessing files directly from your bucket

When you connect your own S3-compatible bucket, ByteStack writes files there directly. You can access them with any S3 client using your own credentials, independent of the ByteStack API.
import boto3
import json

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.us-east-1.amazonaws.com",
    aws_access_key_id="YOUR_ACCESS_KEY",
    aws_secret_access_key="YOUR_SECRET_KEY",
)

response = s3.get_object(
    Bucket="your-bucket-name",
    Key="job_01hx9jk2p4n5m6r7s8t9u0v1w/2026-04-30T08:00:00Z.json",
)

result = json.loads(response["Body"].read())
print(result["result"]["summary"])