SDK, API, connectors. One coherent surface.
Typed Python SDK, OpenAPI 3.1 REST surface, and fourteen encrypted source connectors — designed so a single engineer can wire RadMah AI into the data plane in an afternoon.
- SDK type coverage
- 100%
- REST routes
- 180
- Connectors
- 14
- Webhook sig
- BLAKE3
1from radmah_sdk import Client2 3client = Client(api_key="rm_live_…")4 5# Synthesize from a CSV upload6ds = await client.datasets.upload("./customers.csv")7job = await client.synthesize.run(8 dataset_id=ds.id,9 model="synthesize",10 rows=10_000,11 seed=42,12)13await job.wait()14 15bundle = await client.evidence.fetch(job.id)16assert bundle.verify() # BLAKE3, offline17print(job.metrics.qa_score)- ▶ uploading customers.csv ………… 4.7 MB
- dataset ds_4a7c81 · 20 cols · 482 931 rows
- ▶ POST /v1/synthesize/jobs 202
- job_9b3df1 · estimate 38 s · 14 credits
- ▶ training the engine on 17 numeric / 3 cat …
- epoch 12 / 20 loss 0.083
- epoch 20 / 20 loss 0.041
- ▶ generating 10 000 rows ………… 1.6 s
- ✓ K-S gate 0.018 · χ² gate ok · constraints ok
- ▶ fetching evidence bundle …
- ✓ chain verified root a4f2…d801
- >>> 0.9569
Three entry points. Same evidence chain.
SDK for engineers, REST for the rest of your stack, connectors for the data already in your warehouse — every one of them lands on the same sealed evidence pipeline.
See the contract before you wire it.
X-API-Key: slt_live_AbCdEfGh…
X-Idempotency-Key: 8e0c…b21
Content-Type: application/json
{
"dataset_id": "ds_4a7c81",
"model": "synthesize",
"rows": 10000,
"seed": 42
}X-Job-Id: job_9b3df1
X-Rate-Limit-Remaining: 47
Retry-After: —
{
"job_id": "job_9b3df1",
"status": "queued",
"estimate": { "credits": 14, "seconds": 38 },
"evidence": { "expected_root_pending": true },
"_links": {
"self": "/v1/synthesize/jobs/job_9b3df1",
"stream": "/v1/synthesize/jobs/job_9b3df1/events",
"cancel": "/v1/synthesize/jobs/job_9b3df1:cancel"
}
}- 01SLT signs payloadBLAKE3(payload || ts || rolling_key)→ X-SLT-Signature
- 02Webhook deliveredPOST your endpoint with headers→ X-SLT-Event
- 03You verifyverify(payload, sig, key)→ ts within ±5 min
- 04Process if ok, 401 if notno signature → reject silently→ replay-protected
Posture & auth that survives security review.
Tenant isolation
JWT carries tenant_id; every query filtered at the ORM. No cross-tenant fetch is physically possible.
Scoped keys
Read / generate / admin scopes, per-key rate-limit overrides, immediate revocation.
Signed webhooks
HMAC-SHA256 signature with per-tenant rolling key + timestamp; 5-minute replay window.
Idempotent retries
Idempotency-Key header stored 24 h; safe retry on transient 5xx without duplicate work.
Jump straight to it.
pip install radmah-sdk
SDK from PyPI, OpenAPI from the docs, or a working session with our integrations engineer. Pick whichever moves you fastest.
X-API-Key: slt_live_AbCdEfGh…
X-Idempotency-Key: 8e0c…b21
Content-Type: application/json
{
"dataset_id": "ds_4a7c81",
"model": "synthesize",
"rows": 10000,
"seed": 42
}X-Job-Id: job_9b3df1
X-Rate-Limit-Remaining: 47
Retry-After: —
{
"job_id": "job_9b3df1",
"status": "queued",
"estimate": { "credits": 14, "seconds": 38 },
"evidence": { "expected_root_pending": true },
"_links": {
"self": "/v1/synthesize/jobs/job_9b3df1",
"stream": "/v1/synthesize/jobs/job_9b3df1/events",
"cancel": "/v1/synthesize/jobs/job_9b3df1:cancel"
}
}