Platform API Reference
Clean datasets programmatically via REST API. Submit jobs, poll status, and download results. Your API key tier determines rate limits and quotas.
Quick Start
Three steps to clean your first dataset:
Create an API key in Dashboard > Settings > API Keys
Submit a cleaning job with your file URL
Poll job status, then download the cleaned result
# 1. Submit a cleaning job
curl -X POST https://augea.org/api/platform/v1/clean \
-H "Authorization: Bearer aug_live_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"file_url": "https://my-bucket.s3.amazonaws.com/data.csv", "modality": "tabular"}'
# Response: {"job_id": "abc-123", "status": "queued", "request_id": "req_..."}
# 2. Check job status
curl https://augea.org/api/platform/v1/clean/abc-123 \
-H "Authorization: Bearer aug_live_YOUR_KEY_HERE"
# 3. Download cleaned result (when status is "completed")
curl https://augea.org/api/platform/v1/clean/abc-123/download \
-H "Authorization: Bearer aug_live_YOUR_KEY_HERE" -o cleaned_data.csvAuthentication
All API requests require a valid API key in the Authorization header.
Authorization: Bearer aug_live_YOUR_KEY_HERESecurity
- Keys are shown only once at creation. Store securely.
- Never expose keys in frontend code, git repos, or client-side JavaScript.
- Use environment variables:
AUGEA_API_KEY - Rotate keys immediately if compromised via Dashboard > Settings > API Keys.
- Each request is logged, rate-limited, and traced with a unique
request_id.
Base URL
https://augea.org/api/platform/v1All endpoints are relative to this base.
Endpoints
/cleanSubmit a new data cleaning job.
Request Body
file_urlstring*Public URL of the file to clean. Must be HTTPS. Localhost, private IPs, and file:// are blocked.
modalitystringFile type hint. One of: tabular, text, image, audio, video, model, pointcloud
webhook_urlstringURL to receive a POST when the job completes. Signed with HMAC-SHA256.
metadataobjectArbitrary JSON (max 4KB) stored with the job. Returned in GET responses.
curl -X POST /api/platform/v1/clean \
-H "Authorization: Bearer aug_live_..." \
-H "Content-Type: application/json" \
-d '{
"file_url": "https://my-bucket.s3.amazonaws.com/raw.csv",
"modality": "tabular",
"webhook_url": "https://my-app.com/hooks/cleaning",
"metadata": {"project": "sensor-v2", "batch": 42}
}'Response 201
{
"job_id": "3a471fec-925e-4a55-80ef-313d3d42fe48",
"status": "queued",
"request_id": "req_e8b6815367a0444b962966de65340a8f"
}Response Headers
X-Request-ID: Unique request trace ID
X-RateLimit-Limit-Daily: Your daily job quota
X-RateLimit-Remaining-Daily: Jobs remaining today
X-RateLimit-Limit-Monthly: Your monthly quota
X-RateLimit-Remaining-Monthly: Jobs remaining this month
/cleanList your cleaning jobs with optional filtering and cursor-based pagination.
Query Parameters
statusstringFilter by status: queued, running, completed, failed
limitnumberResults per page (1–100, default 20)
cursorstringISO timestamp from next_cursor of previous page
curl "/api/platform/v1/clean?status=completed&limit=10" \
-H "Authorization: Bearer aug_live_..."Response 200
{
"jobs": [
{
"id": "3a471fec-...",
"status": "completed",
"modality": "tabular",
"quality_score": 94,
"created_at": "2026-02-25T12:00:00Z",
"updated_at": "2026-02-25T12:01:30Z"
}
],
"has_more": false,
"next_cursor": null,
"request_id": "req_..."
}/clean/:job_idGet the status and details of a specific cleaning job.
curl /api/platform/v1/clean/3a471fec-925e-4a55-80ef-313d3d42fe48 \
-H "Authorization: Bearer aug_live_..."Response 200
{
"job_id": "3a471fec-...",
"status": "completed",
"modality": "tabular",
"quality_score": 94,
"created_at": "2026-02-25T12:00:00Z",
"completed_at": "2026-02-25T12:01:30Z",
"error": null,
"request_id": "req_..."
}/clean/:job_id/downloadDownload the cleaned output file. Only available when status is 'completed'.
curl /api/platform/v1/clean/3a471fec-.../download \
-H "Authorization: Bearer aug_live_..." \
-o cleaned_output.csvReturns 422 job_not_ready if the job is not yet completed.
Webhooks
When you provide a webhook_url, we'll POST to it when the job finishes. Each webhook is signed so you can verify it came from Augea.
Verifying signatures
The X-Augea-Signature header contains a timestamp and HMAC-SHA256 signature:
X-Augea-Signature: t=1708900000,v1=5af3e2c8b9d1f4...import crypto from "crypto";
function verifyWebhook(payload, header, secret) {
const [tPart, sigPart] = header.split(",");
const timestamp = tPart.replace("t=", "");
const signature = sigPart.replace("v1=", "");
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${JSON.stringify(payload)}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature, "hex"),
Buffer.from(expected, "hex")
);
}Error Codes
| Status | Error Code | Description |
|---|---|---|
| 400 | bad_request | Missing/invalid field (file_url, modality, etc.) |
| 400 | invalid_modality | Unsupported modality value |
| 401 | missing_key | No Authorization header |
| 401 | invalid_key | API key not found or malformed |
| 401 | revoked_key | API key has been revoked |
| 404 | job_not_found | Job ID does not exist or is not yours |
| 422 | job_not_ready | Job not yet completed (for download) |
| 429 | rate_limit_exceeded | Too many requests/minute |
| 429 | daily_limit_exceeded | Daily job quota reached |
| 429 | monthly_limit_exceeded | Monthly job quota reached |
| 500 | internal_error | Server error. Retry or contact support. |
Rate Limits & Tiers
Your API key tier is set by your subscription plan. Upgrade in Dashboard > Settings > Billing.
| Tier | Rate | Daily | Monthly | Max Rows |
|---|---|---|---|---|
| Free | 10/min | 5/day | 50/mo | 1,000 |
| Pro (Creator) | 30/min | 50/day | 500/mo | 10,000 |
| Enterprise (Team) | 100/min | 500/day | 5,000/mo | 100,000 |
Code Examples
Python
import requests, time, os
API_KEY = os.environ["AUGEA_API_KEY"]
BASE = "https://augea.org/api/platform/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# Submit job
resp = requests.post(f"{BASE}/clean", headers=HEADERS, json={
"file_url": "https://my-bucket.s3.amazonaws.com/raw.csv",
"modality": "tabular",
})
job_id = resp.json()["job_id"]
print(f"Job {job_id} queued")
# Poll until done
while True:
status = requests.get(f"{BASE}/clean/{job_id}", headers=HEADERS).json()
if status["status"] in ("completed", "failed"):
break
time.sleep(5)
# Download
if status["status"] == "completed":
data = requests.get(f"{BASE}/clean/{job_id}/download", headers=HEADERS)
with open("cleaned.csv", "wb") as f:
f.write(data.content)
print("Done!")TypeScript / Node.js
const API_KEY = process.env.AUGEA_API_KEY!;
const BASE = "https://augea.org/api/platform/v1";
const headers = { Authorization: `Bearer ${API_KEY}` };
// Submit job
const { job_id } = await fetch(`${BASE}/clean`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
file_url: "https://my-bucket.s3.amazonaws.com/raw.csv",
modality: "tabular",
}),
}).then(r => r.json());
console.log(`Job ${job_id} queued`);
// Poll until done
let status: string;
do {
await new Promise(r => setTimeout(r, 5000));
const job = await fetch(`${BASE}/clean/${job_id}`, { headers }).then(r => r.json());
status = job.status;
} while (status !== "completed" && status !== "failed");
// Download
const file = await fetch(`${BASE}/clean/${job_id}/download`, { headers });
const buffer = await file.arrayBuffer();
Bun.write("cleaned.csv", buffer); // or fs.writeFileSync for NodecURL (one-liner)
# Submit, get job_id, poll, download
JOB=$(curl -s -X POST https://augea.org/api/platform/v1/clean \
-H "Authorization: Bearer $AUGEA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"file_url":"https://my-bucket.s3.amazonaws.com/raw.csv"}' | jq -r .job_id)
echo "Polling job $JOB..."
while [ "$(curl -s https://augea.org/api/platform/v1/clean/$JOB \
-H "Authorization: Bearer $AUGEA_API_KEY" | jq -r .status)" != "completed" ]; do
sleep 5
done
curl -o cleaned.csv https://augea.org/api/platform/v1/clean/$JOB/download \
-H "Authorization: Bearer $AUGEA_API_KEY"Ready to get started?
Create an API key and submit your first cleaning job.
Get API Key