A null spike, a type mismatch, a schema change — your flow loads it anyway. Debugging takes hours. Block bad data before it loads.
Catches schema drift, null spikes, and type mismatches in milliseconds — before your load task runs.
Your Prefect flow extracts, transforms, and loads successfully. But a null spike crept in upstream. The warehouse has bad rows. Your downstream flow fails mysteriously. Root cause takes hours.
DataScreenIQ screens the payload before storage. A BLOCK stops the pipeline instantly — bad rows go to a dead-letter queue, not your database.
report = client.screen(rows, source="orders")
if report.is_blocked:
raise ValueError(report.summary()) # flow fails fast with a clear report
Install the SDK, drop in the integration, get PASS / WARN / BLOCK on every run.
Add datascreeniq to your Prefect deployment's dependencies.
Add DATASCREENIQ_API_KEY as a Prefect Secret Block or environment variable.
Insert a @task between your extract/transform and load tasks. The screen call returns a report — raise on BLOCK to fail the flow cleanly.
Use Prefect automations or the report summary to route alerts to Slack, PagerDuty, or email when quality degrades.
from prefect import flow, task
from prefect.blocks.system import Secret
import datascreeniq as dsiq
from datascreeniq.exceptions import DataQualityError
@task(retries=0) # no retries on quality failures
def screen_data(rows: list, source: str) -> list:
client = dsiq.Client()
report = client.screen(rows, source=source)
if report.is_warn:
print(f"⚠ Quality warning for {source}: {report.summary()}")
# continue but flag — adjust threshold in dashboard to BLOCK if needed
if report.is_blocked:
raise ValueError(
f"Quality gate BLOCKED {source}: {report.summary()}
"
f"Issues: {report.issues}"
)
return rows
@task
def extract():
return fetch_rows_from_api()
@task
def load(rows):
insert_to_warehouse(rows)
@flow(name="orders-pipeline")
def orders_pipeline():
rows = extract()
clean = screen_data(rows, source="orders") # fails fast on BLOCK
load(clean)
if __name__ == "__main__":
orders_pipeline()
report.summary() message gives you the failure reason directly in the alert.DataScreenIQ runs 18 quality checks in a single pass — null rates, type mismatches, schema drift, outliers, duplicate rates, and more. The result is one of three verdicts.
All checks within thresholds. Pipeline proceeds to load. No action needed.
Quality degraded but above BLOCK threshold. Load proceeds, issue flagged for review.
Critical quality issue detected. Row load prevented. Dead-letter queue or alert triggered.
DataScreenIQ drops into any pipeline that can make an HTTP call.
Quality gate between extract and load.
Block merges when data quality fails.
Catch schema drift in transformed data.
Try DataScreenIQ in 60 seconds.
Free tier: 500K rows/month. No credit card. API key in 30 seconds.
Get a free API key →