Pricing

Straightforward pricing, priced by delivery volume.

One metric — rows delivered per month — instead of a pricing model that punishes you for having a wide table.

Free

$0

  • 1M rows/month
  • 1 dataset
  • Signed URL delivery
  • Manual exports
Get started

Starter

$99/month

  • 10M rows/month
  • Up to 5 datasets
  • Scheduled exports
  • CSV + Parquet
  • S3 destination
  • Retries + manifests
  • 30-day manifest history
Get started

Growth

$399/month

  • 100M rows/month
  • Up to 20 datasets
  • Multiple customer destinations
  • 90-day manifest history
  • Priority support
Get started

Scale

$1,200/month

  • Up to 1B rows/month
  • Delivery SLA
  • Multiple destinations per tenant
  • Extended manifest retention
Contact us

Enterprise

Custom

  • BYOC
  • Custom limits
  • SSO
  • DPA
  • Dedicated support
Contact us

FAQ

Common questions

What counts as a row?

Each record returned by your fetchPage function for a given export run. A dataset with 50,000 customer records exported once counts as 50,000 rows, regardless of column count.

Do you store my customers' data?

No. DataEgress streams rows from your fetchPage endpoint directly to the destination as they're read — nothing is persisted in a DataEgress-owned database. We store run metadata (row counts, checksums, timestamps, manifests), not the row data itself.

Can I use my customer's own S3 bucket?

Yes — that's the primary use case. You register the destination bucket and credentials once per customer, and every scheduled export delivers straight into storage they control.

What happens if an export fails?

The run is marked failed with the stage it failed at and how many rows were processed before that point. Retries reuse deterministic destination keys, so a retry overwrites the same file rather than creating a duplicate.

Do you support Parquet?

Yes, alongside CSV. Parquet output is typed and compressed, and loads directly into tools like DuckDB or Spark without a conversion step.

Do you support incremental exports?

DataEgress does not perform change-data-capture. Your fetchPage function controls what's included in each run — most teams pass a cursor or timestamp filter to their own query to select only new or changed rows, keeping row selection logic under application control.

Do you need database access?

No. DataEgress never connects to your database. You expose a fetchPage HTTP endpoint with the SDK, and DataEgress calls it for each page of rows — the same access model as any other webhook.

Not sure which plan fits?

Tell us what you’re trying to deliver and we’ll help you figure out the right tier.