Technical documentation
Platform & API Manual
Updated October 23, 2026
1. Ingestion and schema profiling
The upload pipeline detects the delimiter and encoding, flags misaligned rows, and infers a type for each column. Type inference covers the full file by default, so a late-row type change is not missed. Columns may be typed as integer, float, datetime, or string.
2. EDA diagnostics
The profile is computed on the loaded dataset, not a small preview. Metrics include row and column counts, missing cells (nulls plus recognised junk tokens such as N/A and --), unique counts, numeric ranges, quantiles, skewness, kurtosis, IQR, and top frequencies.
Correlations account for missing values without imputing them, and any column cap is disclosed in the interface.
3. Execution safeguards
Deterministic cleaning runs server-side. When an optional model-assisted step is used for an ambiguous mapping, its output is validated before execution and runs in a restricted environment with resource limits. We do not accept arbitrary user Python.
Isolation is process-level; we do not represent it as hardware-VM isolation. Contact security@getrightrow.com for the current control details.
4. Post-clean audit
Every run returns a diff: rows before/after, columns before/after, cells modified, and missing cells before/after. The data-lost report reconstructs dropped rows exactly when the dataset has a stable identifier. When exact row identity cannot be proven, the report is labelled approximate instead of presenting the result as fact.
5. Headless REST API
The API is available with an API key managed in the web app. Replace YOUR_RIGHTROW_HOST with the host shown in your deployment configuration.
Upload a dataset
curl -X POST "https://YOUR_RIGHTROW_HOST/api/upload" \ -H "X-API-Key: $RIGHTROW_API_KEY" \ -F "file=@customers_dirty.csv"
Run the cleaner
import os
import requests
API_KEY = os.environ["RIGHTROW_API_KEY"]
BASE_URL = "https://YOUR_RIGHTROW_HOST"
with open("leads.csv", "rb") as f:
upload = requests.post(
f"{BASE_URL}/api/upload",
headers={"X-API-Key": API_KEY},
files={"file": f},
).json()
clean = requests.post(
f"{BASE_URL}/api/clean",
headers={"X-API-Key": API_KEY},
data={
"file_path": upload["file_path"],
"delimiter": ",",
"column_types_json": '{"email": "string", "signup_date": "date", "revenue": "float"}',
"selected_actions_json": '["dates", "currency", "duplicates"]',
},
).json()
print(clean["success"])
print(clean.get("diff"))
print(clean.get("data_lost"))6. Data handling
Uploaded and derived files are temporary and are deleted within 60 minutes by default. We do not train models on customer datasets. The optional model-assisted step receives a small sample with sensitive fields redacted; the deterministic path does not call a model.
See the privacy policy for subprocessors and data-subject rights.

